为了更多地学习C#,我试图创建自己的(虽然是基本的)CSV读取器,获取第一行有描述的CSV文件,然后剩下的行保存数字数据。
我能够找到行数和元素数。因为我知道这两个数字,所以我只声明一个数组:
string [,] file_data = new string[row_count, column_count];
当我尝试从CSV文件中读取值并将它们存储到二维数组中时,会出现问题:
var reader = new StreamReader(File.OpenRead(user_input_file));
for(int row_index = 0; row_index < row_count; row_count++){
for(int column_index = 0; column_index < column_count; column_index++){
var line = reader.ReadLine();
var values = line.Split(',');
// seem to be having problem here.
// It compiles but returns an unhandled exception
file_data[row_index, column_index] = values[column_index];
}
}
当我编写代码时,我没有问题;但是,当我在终端中运行代码时,出现以下错误:
未处理的例外情况: System.NullReferenceException:对象引用未设置为ReadCSV.Main(System.String [] args)[0x00000]中&lt; filename unknown&gt;中的对象实例:0 [错误]致命未处理异常:System.NullReferenceException:对象引用未设置为ReadCSV.Main(System.String [] args)[0x00000]中&lt; filename unknown&gt;的对象实例:0
答案 0 :(得分:2)
第一个错误
您正在循环row_count
你必须循环row_index
,然后强>
你的readline()语句在第二个循环中..
因此,每次执行readline()语句时,它都会跳转到下一行。在你的for循环中,你想循环到你的row_count,这样会导致文件被读取更多的行,并导致异常
喜欢
for(int row_index = 0; row_index < row_count; row_index++){//<= You were using row_count++
var line = reader.ReadLine();
var values = line.Split(',');
for(int column_index = 0; column_index < column_count; column_index++){
// seem to be having problem here. It compiles but returns an unhandled exception
file_data[row_index, column_index] = values[column_index];
}
}
注意:如果您不想对行数进行硬编码,可以使用EndOfStream限制循环
for(int row_index = 0; !reader.EndOfStream; row_index++)