vb.net 2013 - 使用 streamreader 删除空行

vb.net 2013 - removing blank lines with streamreader

我正在使用此代码片段(可在此处找到)将 csv 文件读入数组。

sFile = "c:\test.txt"
Dim sData() As String
Dim arrName, arrValue as New List(Of String)()

Using sr As New StreamReader(sFile)
    While Not sr.EndOfStream
        sData = sr.ReadLine().Split(","c)

        arrName.Add(sData(0).Trim())
        arrValue.Add(sData(1).Trim())
    End While
End Using

我的源文件在文件末尾包含 2 - 3 个空行。 尽管使用 Trim() - 我仍然将这些空行插入到数组中,这导致我的其余代码失败。

我已通过删除空行验证它是否有效。

我已经尝试了在这里和 MSDN 上找到的各种技术,但我似乎无法摆脱这些空白行。

有人可以帮忙吗?

谢谢。

sr.ToString().TrimEnd( Environment.NewLine.ToCharArray())

'vbCrLf or vbNewLine (might work as well)

您可以将该行读入一个单独的变量,并在解析数据之前检查它是否为空:

Using sr As New StreamReader(sFile)
    While Not sr.EndOfStream
        Dim sLine As String = sr.ReadLine()
        If Not String.IsNullOrWhiteSpace(sLine) Then
            sData = sLine.Split(","c)

            arrName.Add(sData(0).Trim())
            arrValue.Add(sData(1).Trim())
        End If
    End While
End Using

您可能还想添加进一步的有效性检查(例如,如果没有逗号,sData(1) 将抛出异常,如果有多个逗号怎么办?)。

我会跳过 streamreader 并使用 File.ReadLines() 方法。这个 returns 一个可以与 Where() 函数一起使用的枚举:

For Each line As String in File.ReadLines(sFile).Where(Function(l) Not String.IsNullOrWhiteSpace(l))
    Dim data = line.Split(","c)
    arrName.Add(data(0).Trim())
    arrValue.Add(data(1).Trim())
Next line

此外,成对的 arrays/Lists 例如 arrNamearrValue 是一种反模式。使用小 class:

更好
Public Class MyData
    Public Property Name As String
    Public Property Value As String

    Public Sub New(ByVal line As String)
       Dim data() as String = line.Split(","c)
       Name = data(0).Trim()
       Value = data(1).Trim()
    End Sub
End Class

现在您可以拥有一个这样的列表:

Dim data As List(Of MyData)

您可以将其余代码写在一行中:

data = File.ReadLines(sFile).Where(Function(l) Not String.IsNullOrWhiteSpace(l)).Select(Function(s) New MyData(l)).ToList()

但为了可读性:

Dim data As List(Of MyData) = File.ReadLines(sFile).
         Where(Function(l) Not String.IsNullOrWhiteSpace(l)).
         Select(Function(s) New MyData(s)).
         ToList()