csv输出错误

时间:2016-03-13 09:20:00

标签: java csv

我正在尝试读取一个csv表并将其解析为一个正在工作的2D数组,但是当我在表中的值旁边有一些空单元格时,它会将值输出到右边。

例如我有这张表:

My Table

' TEST1'在我的2D数组中有以下位置:

array[28][4];

当我输入时:

System.out.println(array[28][4]);

它应该输出' test1',而是我的程序将输出的是' test2' (阵列[28] [5])。 我的表中的其他值(如图所示)工作得非常好,所以我的猜测是与空单元格和分隔符有关(&#34 ;;");

这是我的代码:

try
    {
        BufferedReader reader = new BufferedReader(new FileReader(upload.pathName));
        String strLine;
        for (int i = 0; (strLine = reader.readLine()) != null; i++)
        {
            Scanner scanner = new Scanner(strLine);
            scanner.useDelimiter(";");
            int j = 0;
            System.out.println("row: " + (i+1));
            while (scanner.hasNext())
            {
                String value = scanner.next();

                if(value == null || value.equals(""))
                {
                    System.out.println("null: " + (j+1));
                    j++;
                }
                else
                {
                    array[i][j] = value;
                    System.out.println("column : " + (j+1) + " = " + array[i][j]);
                    j++;
                }
            }
            scanner.close();
        }
        reader.close();
    }
    catch (Exception e)
    {
        System.out.println("Exception");
    }
    System.out.println("Output: " + array[28][4]); //output is test2 instead of test1

在我的代码中,我试图跳过空单元格,检查它们是否为" null"并且所有具有值的单元格都会添加到我的2D数组中。

任何人都有解决方案/可以告诉我我的错误在哪里?

2 个答案:

答案 0 :(得分:0)

您文件的第29行:,,,,test1,test2

来自Scanner#next() JavaDoc:

  

查找并返回此扫描仪的下一个完整令牌。    完整的标记前面跟着匹配的输入    分隔符模式。 [...]

根据这一点,A29正在忽略空单元格Scanner,这会将您的值向左移动一列。给A29任何值都会产生预期的输出。

如果上面引用的文档是真的,那么next()如何返回最后一个值,尽管后面没有分隔符?同一个问题对每行中的第一个值有效,该值不在分隔符之前。 由于都是返回,因此JavaDoc必须对我们说谎。

调查Scanner类的源代码,您可以发现前导分隔符被跳过,next()也会返回“部分令牌”。< / p>

话虽如此,我建议您避免使用Scanner

for (int i = 0; (strLine = reader.readLine()) != null; i++)
{
    String[] splittedLine = strLine.split(";");
    array[i] = splittedLine;
}

注意:上面的代码与空的字符串不同,现在写入数组 - 如果需要,请考虑用null替换它们。

答案 1 :(得分:0)

我认为jp-jee是对的:

String[] splittedLine = strLine.split(";");
for (int j = 0; j < splittedLine.length; j++ ) {
  array[i][j] = splittedLine[j];
}

应该做这个工作,空单元格和#34;&#34;而不是null。