Vb.net 在DataGridView中导入带有逗号和引号中的多行文本的CSV文件
我正在尝试将CSV文件导入DataGridView,但在尝试导入多行文本时遇到了一些问题 我试图导入的是:Vb.net 在DataGridView中导入带有逗号和引号中的多行文本的CSV文件,vb.net,winforms,csv,datagridview,Vb.net,Winforms,Csv,Datagridview,我正在尝试将CSV文件导入DataGridView,但在尝试导入多行文本时遇到了一些问题 我试图导入的是: ID;RW;Name;Description;Def;Unit;Min;Max 0;R;REG_INFO;"state of the machine";0;ms;0;0xFFFF 1;R/W;REG_NUMBER;current number;0;days;0;65,535 这是导入时的效果: 到目前为止,我所实施的: Private Sub btnOpen_Cli
ID;RW;Name;Description;Def;Unit;Min;Max
0;R;REG_INFO;"state of the
machine";0;ms;0;0xFFFF
1;R/W;REG_NUMBER;current number;0;days;0;65,535
这是导入时的效果:
到目前为止,我所实施的:
Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
Using ofd As OpenFileDialog = New OpenFileDialog() With {.Filter = "Text file|*.csv"}
If ofd.ShowDialog() = DialogResult.OK Then
Dim lines As List(Of String) = File.ReadAllLines(ofd.FileName).ToList()
Dim list As List(Of Register) = New List(Of Register)
For i As Integer = 1 To lines.Count - 1
Dim data As String() = lines(i).Split(";")
list.Add(New Register() With {
.ID = data(0),
.RW = data(1),
.Name = data(2),
.Description = data(3),
.Def = data(4),
.Unit = data(5),
.Min = data(6),
.Max = data(7)
})
Next
DataGridView1.DataSource = list
End If
End Using
End Sub
但是,当我尝试加载CSV时,多行文本出现了一些问题,如示例中的“机器状态”。例如,使用该类。(该类在.Net 5中提供) TextFieldParser对象提供用于解析的方法和属性 结构化文本文件。使用TextFieldParser解析文本文件是非常困难的 类似于在使用ReadFields时对文本文件进行迭代 提取文本字段的方法类似于拆分字符串
- 您的数据源是一个分隔的(非固定长度)结构,标题/字段值用符号分隔,因此您可以指定
- 分隔符不是逗号(
中的CSV
),因此需要将分隔符符号传递给方法C
- 调用以将每行提取为字符串数组,表示字段的值(=>此处不执行转换,所有值都作为字符串返回。如果需要,请创建自己的类型转换器。)
传递CSV文件的路径和要使用的分隔符集(此处仅为
;
)。ReadData()
方法返回一个列表(寄存器)
对象,分配给DataGridView.DataSource
设置为True
,因此多行文本实际上可以在单元格中换行(否则会被剪裁)。之后,调用,以便可以看到包装的文本
Dim csvPath = [The CSV Path]
Dim csvParser = New RegisterParser(csvPath, {";"})
DataGridView1.DataSource = csvParser.ReadData()
DataGridView1.Columns("Description").DefaultCellStyle.WrapMode = DataGridViewTriState.True
DataGridView1.AutoResizeRows()
寄存器
类:
添加了一个接受字符串数组的构造函数。您可以将其更改为Object()
,然后向类中添加一个转换器来解析值并将其转换为另一种类型
Public Class Register
Public Sub New(ParamArray values As String())
ID = values(0)
RW = values(1)
Name = values(2)
Description = values(3)
Def = values(4)
Unit = values(5)
Min = values(6)
Max = values(7)
End Sub
Public Property ID As String
Public Property RW As String
Public Property Name As String
Public Property Description As String
Public Property Def As String
Public Property Unit As String
Public Property Min As String
Public Property Max As String
End Class
使用
TextFieldParser
读取数据。它将自动处理引用的数据。顺便说一下,这是错误的:File.ReadAllLines(ofd.FileName.ToList()
。当您完全按照数组的方式使用结果时,对数组调用ToList
有什么意义?另外,无论如何,您不应该调用File.ReadAllLines
。您应该调用File.ReadLines
,并对每个循环使用。也就是说,如果您没有使用TextFieldParser
,您应该这样做。非常感谢您,它似乎工作得很好!
Public Class Register
Public Sub New(ParamArray values As String())
ID = values(0)
RW = values(1)
Name = values(2)
Description = values(3)
Def = values(4)
Unit = values(5)
Min = values(6)
Max = values(7)
End Sub
Public Property ID As String
Public Property RW As String
Public Property Name As String
Public Property Description As String
Public Property Def As String
Public Property Unit As String
Public Property Min As String
Public Property Max As String
End Class