Java CSV文件解析不会在末尾解析空列

我正在解析一个CSV文件,但是有一行是最后9列是空的,而用逗号分割的字符串会忽略剩余的空列。

这是代码来演示这个:

String s="L2,,,,,,,,,,,,,,,,,,108.50,-188.04,,,,,,,,,"; String[] columns = s.split(","); System.out.println(columns.length); 

列的大小是20,当它应该是29.任何想法?

查看String.split的文档:

此方法的作用就像通过调用给定表达式和limit参数为零的双参数split方法一样。 因此,结尾的空字符串不包含在结果数组中。

因此,您需要查看其他split方法的选项

limit参数控制模式的应用次数,因此会影响结果数组的长度。 如果限制n大于零,那么模式将最多应用n – 1次,数组的长度将不大于n,并且数组的最后一个条目将包含超出最后一个匹配分隔符的所有输入。 如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。 如果n为零,那么模式将被应用尽可能多的次数,该数组可以具有任何长度,并且将丢弃尾随的空字符串。

强调我的。

你需要:

 String[] columns = s.split(",", -1); 

分裂的文档说:

如果n为零,那么模式将被应用尽可能多的次数,该数组可以具有任何长度,并且将丢弃 尾随的空字符串

split(String regex)调用重载的split方法,其限制为0.这就是为什么你有一个数组长度为20的原因,-188.04之后的所有空字符串都会在结果数组中被丢弃。

如果要获取所有空尾随字符串,可以给出一个负限制,表示您希望尽可能多地应用该模式。

 String[] columns = s.split(",", -1); //length is 29 there 

虽然解析CSV并不困难,但您可能还想了解如何使用CSV解析器。

你为什么要手动操作实际的CSV解析库呢? 试图吝啬正常工作没有任何好处,因为那里有一些很好的选择。

  • SuperCSV
  • jacksonCSV模块

这些还可以处理CSV的各个方面,例如双倍双引号,处理额外的空白区域等等。