所以,很简单。
我正在将CSV导入数据网格,尽管csv总是必须有可变数量的列。
对于3列,我使用此代码:
Dim sr As New IO.StreamReader("E:\test.txt")
Dim dt As New DataTable
Dim newline() As String = sr.ReadLine.Split(";"c)
dt.Columns.AddRange({New DataColumn(newline(0)), _
New DataColumn(newline(1)), _
New DataColumn(newline(2))})
While (Not sr.EndOfStream)
newline = sr.ReadLine.Split(";"c)
Dim newrow As DataRow = dt.NewRow
newrow.ItemArray = {newline(0), newline(1), newline(2)}
dt.Rows.Add(newrow)
End While
DG1.DataSource = dt
这完美无缺。但是我如何计算“换行符”的数量?
我可以以某种方式对新行的数量进行计数吗?任何其他示例代码都不会发出列标题。
如果我的csv文件有5列,我需要Addrange
为5而不是3等等。
提前致谢
答案 0 :(得分:1)
Dim sr As New IO.StreamReader(path)
Dim dt As New DataTable
Dim newline() As String = sr.ReadLine.Split(","c)
' MsgBox(newline.Count)
' dt.Columns.AddRange({New DataColumn(newline(0)),
' New DataColumn(newline(1)),
' New DataColumn(newline(2))})
Dim i As Integer
For i = 0 To newline.Count - 1
dt.Columns.AddRange({New DataColumn(newline(i))})
Next
While (Not sr.EndOfStream)
newline = sr.ReadLine.Split(","c)
Dim newrow As DataRow = dt.NewRow
newrow.ItemArray = {newline(0), newline(1)}
dt.Rows.Add(newrow)
End While
dgv.DataSource = dt
End Sub
答案 1 :(得分:0)
可以使用dt.Columns.Add
和newrow.Item
将列和项值分别添加到DataTable
,以便可以在循环中完成这些操作,而不是针对特定数字进行硬编码列。例如(此代码假定为Option Infer On
,因此请根据需要进行调整):
Public Function CsvToDataTable(csvName As String, Optional delimiter As Char = ","c) As DataTable
Dim dt = New DataTable()
For Each line In File.ReadLines(csvName)
If dt.Columns.Count = 0 Then
For Each part In line.Split({delimiter})
dt.Columns.Add(New DataColumn(part))
Next
Else
Dim row = dt.NewRow()
Dim parts = line.Split({delimiter})
For i = 0 To parts.Length - 1
row(i) = parts(i)
Next
dt.Rows.Add(row)
End If
Next
Return dt
End Function
然后您就可以使用它:
Dim dt = CsvToDataTable("E:\test.txt", ";"c)
DG1.DataSource = dt