2015-01-20 51 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

相關問題