我试图将循环放入并将 CSV放到2D数组中。
我的应用崩溃归因于var tokens = sr.ReadLine().Split(',');
它会抛出 NullPointerException 。我该如何解决这个问题?
以下是我的整个方法名为 csvToArray :
public string[,] csvToArray (string filePath)
{
int col = colCount(filePath);
int row = rowCount(filePath);
string line;
string[,] data = new string[col, row];
using (StreamReader sr = new StreamReader(filePath))
{
for (int i = 0; i < col; i++)
{
var tokens = sr.ReadLine().Split(',');
for (int j = 0; j < row; j++)
{
data[i, j] = tokens[j];
}
}
}
return data;
}
答案 0 :(得分:1)
让我们首先分析您示例中的错误。
1)为什么事件需要知道开始时行和列的长度?这是开销。
2)循环中的行和列无效。
3)这个异常会引发您的示例,因为您已达到EOF。
所以,这是将csv读取到2D矩阵的更好方法:
public int[][] csvToArray (string filePath)
{
string line = null;
var result = new List<int[]>();
using (var sr = new StreamReader(filePath))
{
while((line = sr.ReadLine()) != null)
{
if(string.IsNullOrWhiteSpace(line)) continue;
result.Add(sr.Split(',').Select(x=> string.IsNullOrWhiteSpace(x) ? 0 : int.Parse(x)).ToArray());
}
}
return result.ToArray();
}
然后您可以检查矩阵的一致性。 至少,这样您就不会打开文件三次并防止计算错误。
答案 1 :(得分:0)
您必须先使用行for
循环,然后使用内循环作为列。
public static string[,] csvToArray(string filePath)
{
int col = colCount(filePath);
int row = rowCount(filePath);
string line;
string[,] data = new string[row, col];
using (StreamReader sr = new StreamReader(filePath))
{
for (int i = 0; i < row; i++)
{
var tokens = sr.ReadLine().Split(',');
for (int j = 0; j < col; j++)
{
data[i, j] = tokens[j];
}
}
}
return data;
}
在您的代码中,您正在执行null.Split()
,这就是它为您提供例外的原因。
如果要在空白行的每个单元格中插入0
,则可以实现以下代码。
for (int i = 0; i < row; i++)
{
string content = sr.ReadLine();
if (!string.IsNullOrEmpty(content))
{
var tokens = content.Split(',');
for (int j = 0; j < col; j++)
{
data[i, j] = tokens[j];
}
}
else
{
for (int j = 0; j < col; j++)
{
data[i, j] = "0";
}
}
}