我正在解析一个CSV文件,但是有一行是最后9列是空的,而用逗号分割的字符串会忽略剩余的空列。
以下是演示此内容的代码:
String s="L2,,,,,,,,,,,,,,,,,,108.50,-188.04,,,,,,,,,";
String[] columns = s.split(",");
System.out.println(columns.length);
列的大小是20,应该是29.任何想法??
答案 0 :(得分:13)
查看String.split
的文档:
此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。因此,尾随空字符串不包含在结果数组中。
因此,您需要查看other split
method
limit参数控制模式的应用次数,因此会影响结果数组的长度。如果限制n大于零,则模式最多应用n - 1次,数组的长度不大于n,并且数组的最后一个条目将包含超出最后匹配的分隔符。 如果n是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。如果n为零,那么模式将被应用尽可能多次,数组可以具有任何长度,并且尾随空字符串将被丢弃。
强调我的。
你需要:
String[] columns = s.split(",", -1);
答案 1 :(得分:1)
分裂的文档说:
如果n为零,那么模式将被应用多次 可能,数组可以有任何长度,尾随空字符串 将被丢弃。
split(String regex)
调用重载的split
方法,其限制为0.这就是为什么你有一个数组长度为20的原因,-188.04之后的所有空字符串都会在结果数组中被丢弃。
如果要获取所有空尾随字符串,可以给出一个负限制,表示您希望尽可能多地应用该模式。
String[] columns = s.split(",", -1); //length is 29 there
虽然解析CSV并不困难,但您可能还想了解如何使用CSV解析器。
答案 2 :(得分:0)
为什么要手动处理实际的CSV解析库?试图吝啬正常工作是没有好处的,因为那里有一些很好的选择。
这些也可以处理CSV的各个方面,如双引号,处理额外的空格等等。