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

时间:2016-06-19 21:14:08

标签: arrays vb.net streamreader blank-line

我正在使用此代码段(在此处找到)将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上找到的各种技术,但我似乎无法摆脱这些空白行。

有人可以帮忙吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我跳过了streamreader并使用File.ReadLines()方法。这将返回一个可以使用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

此外,配对阵列/列表(如arrNamearrValue)也是反模式。使用小班的好多了:

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()

答案 1 :(得分:1)

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

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)会抛出异常,如果有多个逗号会怎么样?)。

答案 2 :(得分:0)

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

'vbCrLf or vbNewLine (might work as well)