0

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

有人可以帮忙吗?

谢谢。

4

3 回答 3

2

我会跳过流式阅读器和使用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()
于 2016-06-20T01:23:27.513 回答
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)将抛出异常,如果有多个逗号怎么办?)。

于 2016-06-19T23:00:21.860 回答
0
sr.ToString().TrimEnd( Environment.NewLine.ToCharArray())

或者

'vbCrLf or vbNewLine (might work as well)
于 2016-06-19T21:17:46.137 回答