我正在尝试将CCS中的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);
}
我的.csv文件有87行,但执行中存在一个奇怪的问题,它会将前15行完全按预期读入数据数组,但是当它下降到data[Row, column] = Line[column];
行时第16次似乎只是突破了整个循环(没有满足sr.EndOfStream
条件)并且没有再将数据读入数据数组。
任何人都可以解释可能发生的事情吗?
答案 0 :(得分:14)
以上代码的较短版本:
var filePath = @"C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv";
var data = File.ReadLines(filePath).Select(x => x.Split(',')).ToArray();
请注意ReadLines
而非ReadAllLines
的用户,根据MSDN documentation,这对较大的文件效率更高:
使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;当您使用ReadAllLines时,必须等待返回整个字符串数组才能访问该数组。因此,当您使用非常大的文件时,ReadLines可以更有效。
答案 1 :(得分: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();
答案 2 :(得分:3)
这与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();
答案 3 :(得分:0)
在不知道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);
}
答案 4 :(得分:0)
使用“打开文件”对话框
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);
}
}