2015-01-20 70 views
3

在任何人跳到结论,是的,我意识到需要逃生管道符号:-)分裂的Java中的管道产生不同的结果

...在我的代码,我也做所以:

String line = "C0000005|A13433185|SCUI|RB|C0036775|A7466261|SCUI||R86000559||MSHFRE|MSHFRE|||N||" 
line = line.trim(); 
String[]  columns_array = line.trim().split("\\|");   // length = 15 
List<String> columns_list = Splitter.on("|").splitToList(line); // size = 17 

我解析一个巨大的文件(〜5GB),每一行是竖线分隔,且上述line是在该文件中,在我的代码与索引出界失误崩溃之首。经过调试,我意识到发生了什么,并添加番石榴Splitter线只是一个健全的检查。使用分离器,我得到预期的列表。

为什么番石榴拆分器和原生拆分的结果不同?

+0

旁边的问题:是您的文件CSV使用dif不定界符?可以为您节省一些使用CSV库的麻烦。 – jpmc26 2015-01-20 23:15:36

+1

我得到15和17. – 2015-01-20 23:18:28

+1

使用'split(“\\ |”,-1);'。 – 2015-01-20 23:18:44

回答

2

String.split() API文档说:

此方法仿佛通过与给定表达式和为零的限制参数调用两个参数分割方法。尾随的空字符串因此不包含在结果数组中。

由于这个事实,您的列表被截断。

您可以使用以下方法来产生正确的结果,作为一个评论者所指出的:

String[] columns_array = line.trim().split("\\|", -1); // length 17 

split(String s, int n)功能的API接收多种ARGS:

如果n是非积极然后该模式将尽可能多次应用和阵列可以有任何长度

6

String.split()从结果数组中删除尾随的空字符串。并且在分割字符串的末尾有两个分隔符(...||)。

下面是来自文档的摘录:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29

此方法仿佛通过与给定表达式和为零的限制参数调用两个参数分割方法。 因此尾随的空字符串不包含在结果数组中。

+0

是的。然而,String.split()的两个arg版本可以用来产生与番石榴显然一样的结果。 – 2015-01-20 23:19:15

+0

@JohnBollinger,是的,'limit'参数必须设置为一个负整数,例如。 '“my | string ||”.split(“\\ |”,-1)'。但恕我直言,'-1'看起来很人造,而番石榴版本看起来稍微可读 - 但这是个人品味的问题。 – 2015-01-20 23:26:10