C# 将.csv文件解析为二维数组
我正在尝试将CSV文件解析为C#中的2D数组。我遇到了一个非常奇怪的问题,下面是我的代码:C# 将.csv文件解析为二维数组,c#,csv,C#,Csv,我正在尝试将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.
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);
}
string filePath=@“C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv”;
StreamReader sr=新的StreamReader(文件路径);
数据=空;
int行=0;
而(!sr.EndOfStream)
{
string[]Line=sr.ReadLine().Split(',');
如果(行==0)
{
数据=新字符串[Line.Length,Line.Length];
}
for(int column=0;column
我的.csv文件有87行,但在执行过程中有一个奇怪的问题,它会完全按照预期将前15行读取到数据数组中,但当它进入data[Row,column]=Line[column]时代码>行第16次似乎只是中断了整个循环(不满足sr.EndOfStream
条件),并且没有向数据数组读取更多数据
有人能解释一下可能发生的情况吗?代码中的任何内容都无法及时获取文件中的行数以供使用
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();
string filePath=@“C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv”;
StreamReader sr=新的StreamReader(文件路径);
变量行=新列表();
int行=0;
而(!sr.EndOfStream)
{
string[]Line=sr.ReadLine().Split(',');
行。添加(行);
行++;
控制台写入线(世界其他地区);
}
var data=lines.ToArray();
在不知道csv文件内容的情况下,我假设错误是由以下行生成的:
if (Row == 0)
{
data = new string[Line.Length, Line.Length];
}
通过将行总数初始化为csv第一行中的列数,可以假定行数始终等于列数
一旦行数大于csv第一行的总列数,您将尝试访问不存在的行,从而使数据
数组溢出
通过将数据更改为允许动态添加项目的列表,可以简化代码:
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);
}
string filePath=@“C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv”;
StreamReader sr=新的StreamReader(文件路径);
列表数据=新列表();
int行=0;
而(!sr.EndOfStream)
{
string[]Line=sr.ReadLine().Split(',');
数据。添加(行);
行++;
控制台写入线(世界其他地区);
}
上述代码的较短版本:
var filePath = @"C:\Users\Matt\Desktop\Eve Spread Sheet\Auto-Manufacture.csv";
var data = File.ReadLines(filePath).Select(x => x.Split(',')).ToArray();
请注意,用户使用的是ReadLines
,而不是ReadAllLines
,这在更大的文件上更有效,如下所示:
使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines会更加高效
这与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();
使用“打开文件”对话框
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);
}
}
OpenFileDialog opn=newopenfiledialog();
如果(opn.ShowDialog()==DialogResult.OK)
{
StreamReader sr=新的StreamReader(opn.FileName);
列表数据=新列表();
int行=0;
而(!sr.EndOfStream)
{
string[]Line=sr.ReadLine().Split(',');
数据。添加(行);
行++;
控制台写入线(世界其他地区);
}
}
每行的列数是否相同?列的数量等于行的数量吗?您正在将数组中的总行初始化为csv第一行中的列数。我认为您的csv文件中有一些特殊的chr。首先从csv中删除前15行,然后将其上传。如果你得到同样的错误,那么replyI删除了第16行,同样的事情发生了,我删除了第15行周围的几行,同样的事情发生了。它似乎只能读取15行代码,但现在给出了解释,说明了为什么代码从未离开while循环,之后也不会执行任何操作。这是我在编程中遇到的最奇怪的事情。@MattR共有87行并非所有行都有相同数量的列,但对于前15行,它只是用空白值完全按照预期填充空格,所以我不认为这是问题所在,因为第16行的列数比第一行大?但是,由于我们正在立即转换为数组,所以这里没有任何区别。这个解决方案与Khan的解决方案有相同的问题。x、 Split()将分割包含逗号的单元格数据。这不是一个可靠的解决方案。假设您有以下数据:1,2,“您看到,这是文本。”来自.Split()的输出将包含5项,而不是3项。具体取决于数据。如果您知道它处理的数据不包含逗号,那么这样做应该没问题。出于这个原因,我总是将CSV默认值更改为管道“|”分隔的文件格式。这不适用于带有逗号的单元格,例如:data1、data2、data3、“data、with、comma”、data5