首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV到2D数组,但拆分函数抛出一个NullPointerException

CSV到2D数组,但拆分函数抛出一个NullPointerException
EN

Stack Overflow用户
提问于 2017-01-23 09:40:10
回答 2查看 85关注 0票数 0

我试图通过循环并将CSV放入2D数组。

我的应用程序由于抛出一个var tokens = sr.ReadLine().Split(',');而使崩溃我怎么才能解决这个问题?

下面是我的整个方法,名为csvToArray

代码语言:javascript
复制
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;
        }

没有意义的是,它完成了整个循环。异常下面的变量具有本应具有的值。

EN

回答 2

Stack Overflow用户

发布于 2017-01-23 09:49:10

您必须首先对行使用for循环,然后对列使用内环。

代码语言:javascript
复制
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,则可以实现以下代码。

代码语言:javascript
复制
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";
                    }
                }
            }
票数 1
EN

Stack Overflow用户

发布于 2017-01-23 09:50:30

让我们先分析一下你的例子中的错误。

1)为什么你要知道乞讨中行和列的长度?就在头顶上。

2)循环中的行和列无效。

3)此异常抛出您的示例,因为您达到了EOF。

因此,下面是将csv读入2D矩阵的更好方法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41803125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档