我正在使用此代码段(在此处找到)将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上找到的各种技术,但我似乎无法摆脱这些空白行。
有人可以帮忙吗?
感谢。
答案 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
此外,配对阵列/列表(如arrName
和arrValue
)也是反模式。使用小班的好多了:
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)