VB.NET:将 CSV 文件读入二维数组

Posted

技术标签:

【中文标题】VB.NET:将 CSV 文件读入二维数组【英文标题】:VB.NET: Reading a CSV file into a 2D array 【发布时间】:2011-08-12 05:35:02 【问题描述】:

我正在处理一个需要我从 CSV 文件中获取值的项目。我必须对这些值进行进一步处理,如果我可以在二维数组中包含这些值,那就太好了。 CSV 文件的行数和列数会定期更改。

我无法将这些值放入 VB.NET/C# 中的二维数组中。可以请我帮忙吗?

这里是我使用的代码:

Imports System.IO

Public Class Form1
    Private Sub ReadCSVFileToArray()
        Dim strfilename As String
        Dim num_rows As Long
        Dim num_cols As Long
        Dim x As Integer
        Dim y As Integer
        Dim strarray(1, 1) As String

        ' Load the file.
        strfilename = "test.csv"

        'Check if file exist
        If File.Exists(strfilename) Then
            Dim tmpstream As StreamReader = File.OpenText(strfilename)
            Dim strlines() As String
            Dim strline() As String

            strlines = tmpstream.ReadToEnd().Split(Environment.NewLine)

            ' Redimension the array.
            num_rows = UBound(strlines)
            strline = strlines(0).Split(",")
            num_cols = UBound(strline)
            ReDim strarray(num_rows, num_cols)

            ' Copy the data into the array.
            For x = 0 To num_rows
                strline = strlines(x).Split(",")
                For y = 0 To num_cols
                    strarray(x, y) = strline(y)
                Next
            Next

            ' Display the data in textbox

            For x = 0 To num_rows
                For y = 0 To num_cols
                    TextBox1.Text = TextBox1.Text & strarray(x, y) & ","
                Next
                TextBox1.Text = TextBox1.Text & Environment.NewLine
            Next

        End If
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ReadCSVFileToArray()
    End Sub
End Class

【问题讨论】:

相关:***.com/questions/906841/csv-parser-reader-for-c、***.com/questions/1103495/…、***.com/questions/3509640/reading-csv-file-c 【参考方案1】:

您可以使用CsvReader from here 轻松方便地将 csv(或其他类似数据)读入 DataTable(或 IDataReader)。在这种情况下,它始终是我的首选 - 快速且非常强大。

【讨论】:

似乎与 VS2012 不兼容。不投反对票,仅供参考。 @Kez 以什么方式?什么失败了?你的目标是什么框架? (IDE 可以针对许多框架 - net20、net30、net35、net40、net45,还可以针对 netcore(“windows 商店”)、CF、MF、SL、WP7 等。【参考方案2】:

我并不反对 Marc Gravell,因为你不应该尝试重新发明***。他的解决方案会表现最好,并且可能有许多 CSV 格式的细微差别会搞砸一个简单的解析器,如下所示。

话虽如此,您需要一个返回二维数组的 CSV 解析器。下面的代码就是这样做的(锯齿状数组),并且应该适用于一个非常简单的 CSV 文件。这会跳过文件中的标题行。

(抱歉,它不在 VB 中,但您可以将其放在项目中的辅助类中)

private string[][] GetData(string fileName)

  List<string[]> data = new List<string[]>();

  using (StreamReader sr = new StreamReader(fileName))
  
    bool headerRow = true;
    string line;

    while ((line = sr.ReadLine()) != null)
    
      if (headerRow)
      
        headerRow = false;
      
      else
      
        string[] split = line.Split(new char[]  ',' );

        data.Add(split);
      
    
  

  return data.ToArray();

【讨论】:

【参考方案3】:

由于 CSV 的所有可能变体,解析 CSV 文件可能非常困难。见:http://en.wikipedia.org/wiki/Comma-separated_values

例如,考虑嵌入引号、逗号等。 因此,读取行/字符串并拆分它们并不是一件简单的事情。

也许你最好使用a third party library

【讨论】:

【参考方案4】:

由于列数和行数经常变化,您可以使用动态列表而不是固定的二维数组。

List<List<string>> data = new List<List<string>>();

然后,当您解析 CSV 文件时,您可以在上述结构中动态构建数据,为 CSV 文件中的每个新行添加一个新的 List&lt;string&gt;data

更新:等效的 VB.NET 类似于

data As New List(Of List(Of String))

话虽如此,@Mark Gravell 的建议是比自己做这个更好的解决方案。

【讨论】:

以上是关于VB.NET:将 CSV 文件读入二维数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sscanf() 不将 CSV 文件中的行读入数组?

VB.net中,请问如何将二维数组的数值显示在listview控件中?

无法将制表符分隔的文件读入 numpy 二维数组

C++ 图像处理 - 将图像文件读入二维数组

对于 VB.NET 中二维数组上的每个循环

Visual C# 无法将 CSV 文件加载到二维数组中