我正在尝试读取一个csv表并将其解析为一个正在工作的2D数组,但是当我在表中的值旁边有一些空单元格时,它会将值输出到右边。
例如我有这张表:
' 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数组中。
任何人都有解决方案/可以告诉我我的错误在哪里?
答案 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。