将.csv文件解析为 2D 数组
本文关键字:2D 数组 csv 文件 | 更新日期: 2023-09-27 18:31:16
我正在尝试将CSV文件解析为C#中的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);
}
我的.csv文件有 87 行,但在执行中存在一个奇怪的问题,它将完全按预期将前 15 行读取到数据数组中,但是当它下降到第 16 次下降到data[Row, column] = Line[column];
行时,它似乎只是脱离了整个循环(不满足sr.EndOfStream
条件)并且没有将更多数据读取到数据数组中。
谁能解释一下可能发生的事情?
上面
代码的较短版本:
var filePath = @"C:'Users'Matt'Desktop'Eve Spread Sheet'Auto-Manufacture.csv";
var data = File.ReadLines(filePath).Select(x => x.Split(',')).ToArray();
请注意,根据 MSDN 文档,用户使用 ReadLines
而不是 ReadAllLines
,这对于较大的文件更有效:
使用 ReadLines 时,可以在返回整个集合之前开始枚举字符串集合;使用 ReadAllLines 时,必须等待返回整个字符串数组,然后才能访问数组。因此,当您处理非常大的文件时,ReadLines 可以更高效。
代码中的任何内容都不会及时从文件中获取行数以使用它。
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();
这与 Pavel 发布的相同,但它忽略了可能导致程序崩溃的空行。
var filePath = @"C:'Users'Matt'Desktop'Eve Spread Sheet'Auto-Manufacture.csv";
string[][] data = File.ReadLines(filepath).Where(line => line != "").Select(x => x.Split('|')).ToArray();
在不知道您的csv文件的内容的情况下,我会假设错误是由以下行生成的:
if (Row == 0)
{
data = new string[Line.Length, Line.Length];
}
通过将行总数初始化为 csv 第一行中的列数,您假定行数始终等于列数。
一旦行数大于 csv 第一行的总列数,您将通过尝试访问不存在的行来溢出data
数组。
您可以通过将data
更改为列表来简化代码,以允许动态添加项目:
string filePath = @"C:'Users'Matt'Desktop'Eve Spread Sheet'Auto-Manufacture.csv";
StreamReader sr = new StreamReader(filePath);
List<string> data = new List<string[]>();
int Row = 0;
while (!sr.EndOfStream)
{
string[] Line = sr.ReadLine().Split(',');
data.Add(Line);
Row++;
Console.WriteLine(Row);
}
带有"打开文件"对话框
OpenFileDialog opn = new OpenFileDialog();
if (opn.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(opn.FileName);
List<string[]> data = new List<string[]>();
int Row = 0;
while (!sr.EndOfStream)
{
string[] Line = sr.ReadLine().Split(',');
data.Add(Line);
Row++;
Console.WriteLine(Row);
}
}