Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在DataGridView中导入带有逗号和引号中的多行文本的CSV文件_Vb.net_Winforms_Csv_Datagridview - Fatal编程技术网

Vb.net 在DataGridView中导入带有逗号和引号中的多行文本的CSV文件

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

我正在尝试将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_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