Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将.csv文件解析为二维数组_C#_Csv - Fatal编程技术网

C# 将.csv文件解析为二维数组

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.

我正在尝试将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);
}
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