VB.NET:将CSV文件读入2D数组

时间:2011-04-25 09:31:59

标签: vb.net arrays csv

我正在开展一个项目,要求我从CSV文件中获取值。我将使用这些值进行进一步处理,如果我可以在2D数组中使用这些值,那就太棒了。 CSV文件的行数和列数会定期更改。

我无法将这些值带入VB.NET/C#中的2D数组中。我可以请一点帮忙吗?

这里是我使用的代码:

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我并不反对马克·格拉维尔,因为你不应该试图重新发明轮子。他的解决方案将发挥最佳性能,并且可能存在许多CSV格式的细微差别,这些细微差别会破坏简单的解析器,例如下面演示的解析器。

话虽如此,您要求提供一个返回2D数组的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();
}

答案 2 :(得分:0)

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

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

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

更新: VB.NET等价物就像

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

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

答案 3 :(得分:0)

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

例如,考虑嵌入式引号,逗号等。 所以读取线条/字符串并拆分它们不是一件简单的事情。

使用a third party library

或许你会更好