在Java中通过管道拆分会产生不同的结果

时间:2015-01-20 23:12:37

标签: java arrays regex split guava

在任何人得出结论之前,是的,我知道需要逃避管道符号: - )

...在我的代码中,我已经这样做了:

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行作为一个完整性检查。使用拆分器,我得到了预期的列表。

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

2 个答案:

答案 0 :(得分:6)

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

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

  

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

答案 1 :(得分:2)

String.split()的API文档说:

  

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

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

您可以使用以下内容生成正确的结果,正如一位评论者已经指出的那样:

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

接受多个参数的split(String s, int n)函数的API:

  

如果n是非正数,那么模式将被应用尽可能多次并且数组可以具有任何长度