将.csv文件解析为2d数组

12 c# csv

我正在尝试使用C#将CSV文件解析为2D数组.我有一个非常奇怪的问题,这是我的代码:

string filePath = @"C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv";
StreamReader sr = new StreamReader(filePath);
data = null; 
int Row = 0;
while (!sr.EndOfStream)
{
    string[] Line = sr.ReadLine().Split(',');
    if (Row == 0)
    {
        data = new string[Line.Length, Line.Length];
    }
    for (int column = 0; column < Line.Length; column++)
    {
        data[Row, column] = Line[column];
    }
    Row++;
    Console.WriteLine(Row);
}
Run Code Online (Sandbox Code Playgroud)

我的.csv文件有87行,但在执行中有一个奇怪的问题,它将完全按预期读取数据数组中的前15行但是当它data[Row, column] = Line[column];第16次下降到该行时它似乎刚刚爆发整个循环(sr.EndOfStream不满足条件)并且不再将数据读入数据数组.

任何人都可以解释可能发生的事情吗?

Pav*_*tov 14

以上代码的较短版本:

var filePath = @"C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv";
var data = File.ReadLines(filePath).Select(x => x.Split(',')).ToArray();
Run Code Online (Sandbox Code Playgroud)

请注意用户ReadLines而不是ReadAllLines,根据MSDN文档,这对更大的文件更有效:

使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合; 当您使用ReadAllLines时,必须等待返回整个字符串数组才能访问该数组.因此,当您使用非常大的文件时,ReadLines可以更高效.

  • 这个解决方案与Khan的问题相同.x.Split()将分割单元格数据(如果它包含逗号). (2认同)

Kha*_*han 11

您的代码中没有任何内容可以及时获取文件中的行数以便使用它.

Line.Length 表示csv中的列数,但看起来您也尝试使用它来指定文件中的行数.

这应该可以得到你预期的结果:

string filePath = @"C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv";
StreamReader sr = new StreamReader(filePath);
var lines = new List<string[]>();
int Row = 0;
while (!sr.EndOfStream)
{
    string[] Line = sr.ReadLine().Split(',');
    lines.Add(Line);
    Row++;
    Console.WriteLine(Row);
}

var data = lines.ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个强大的解决方案.假设你有这样的数据:1,2,"你看,这是文本." .Split()的输出将包含5个项而不是3个. (3认同)