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<string>
到 data
。
更新:等效的 VB.NET 类似于
data As New List(Of List(Of String))
话虽如此,@Mark Gravell 的建议是比自己做这个更好的解决方案。
【讨论】:
以上是关于VB.NET:将 CSV 文件读入二维数组的主要内容,如果未能解决你的问题,请参考以下文章