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

Я разбор огромного файла (~ 5 Гб), где каждая строка является трубой с разделителями, и выше line является первым в этом файл, где мой код разбивает с индексом из ошибок границ. После отладки я понял, что происходит, и добавил линию guava Splitter точно так же, как проверку работоспособности. Используя splitter, я получаю ожидаемый список.

Почему результаты разветвления гуавы и родной раскол разные?

+0

Боковой вопрос: это ваш файл CSV us с другим разделителем? Возможно, вам будет сложно использовать библиотеку CSV. – jpmc26

+1

Я получаю 15 и 17. –

+1

Используйте 'split (" \\ | ", -1);'. –

ответ

2

Документация API для String.split() говорит:

Этот метод работает, если путем вызова метода разделения двух аргументов с заданным выражением и предельным аргументом, равным нулю. Поэтому конечные пустые строки не включаются в результирующий массив.

Ваш список усечен из-за этого факта.

Вы можете использовать следующие для получения правильного результата, так как один из комментаторов уже указывали:

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

АНИ для функции split(String s, int n), принимающих несколько аргов:

Если п не- положительный, то шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину

6

String.split() удаляет завершающие пустые строки из результирующего массива. И у вас есть два разделителя в конце разделяемой строки (...||).

Вот выдержка из документации: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29

Этот метод работает, если путем вызова метода разделения двух аргументов с заданным выражением и предельным аргументом, равным нулю. Таким образом, конечные пустые строки не включаются в результирующий массив.

+0

Да. Однако версия с двумя аргументами 'String.split()' может использоваться для получения того же результата, что и guava. –

+0

@JohnBollinger, да, аргумент 'limit' должен быть установлен на отрицательное целое число, например. '' my | string || ".split (" \\ | ", -1)'. Но IMHO, «-1» выглядит искусственно, а версия Guava выглядит немного читабельнее - это вопрос личного вкуса. –