Java中使用管道分割字符串产生不同结果

3

在任何人得出结论之前,是的,我知道需要转义竖杠符号 :-)

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

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是该文件中的第一行,在我的代码中,它会因索引超出范围而崩溃。调试后,我意识到了发生了什么,并添加了guava Splitter行作为健全性检查。使用splitter,我得到了预期的列表。

为什么guava splitter和原生的split结果不同?


旁边的问题:你的文件是使用不同分隔符的CSV吗?使用CSV库可能会节省您一些麻烦。 - jpmc26
1
使用split("\\|", -1); - Sotirios Delimanolis
是的,17...修正了问题。 - Chthonic Project
2个回答

6
String.split()方法会从结果数组中删除尾随的空字符串。当分割的字符串末尾有两个分隔符(...||)时,该方法同样适用。

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

此方法的工作方式就像使用给定表达式和限制参数为零调用两个参数的split方法一样。因此,在结果数组中不包括尾随的空字符串。


是的。然而,String.split() 的两个参数版本可以用来产生与guava显然相同的结果。 - John Bollinger
@JohnBollinger,是的,limit参数必须设置为负整数,例如"my|string||".split("\\|", -1)。但在我看来,-1看起来有些不自然,而Guava版本看起来稍微更易读一些——不过这只是个人口味问题。 - Alex Shesterov

2

String.split()的API文档如下:

该方法的工作方式类似于使用给定表达式和限制参数为零调用双参数拆分方法。因此,尾随空字符串不包含在结果数组中。

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

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

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

如果 n 是非正数,则模式将被尽可能地应用,数组可以具有任何长度。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接