CSV到2D数组但Split函数抛出NullPointerException

时间:2017-01-23 09:40:10

标签: c# .net csv multidimensional-array webforms

我试图将循环放入并将 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;
        }

没有意义的是它完成了整个循环。异常下面的变量具有它们应该具有的值enter image description here

2 个答案:

答案 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";
                    }
                }
            }