При обработке строки csv с пустым конечным полем myString.split (",") возвращает неправильное количество записей массива

Я обрабатываю определенную строку, прочитанную из CSV-файла, используя String.split(",") и обнаруживая, что окончательная пустая строка после последнего разделителя не попадает в массив, созданный функцией split .

Вот значения переменных, которые вызывают ошибку:

 String toSplit = "1,Some Value,31337,Another Value,"; String[] values = toSplit.split( "," ); 

Массив values заканчивается тем, что меньше ожидаемого количества записей массива. Созданный массив:

 values[0] : '1' values[1] : 'Some Value' values[2] : '31337' values[3] : 'Another Value' 

Со values[4] бросающими исключение ArrayIndexOutOfBounds.

Массив, который я хочу:

 values[0] : '1' values[1] : 'Some Value' values[2] : '31337' values[3] : 'Another Value' values[4] : '' 

Одно предостережение: я читаю вывод другого создателя файла .csv и не хочу использовать ограничители строк или бросать «пробельный символ» в места, где данные пустые. ( toSplit = "1,Some Value,31337,Another Value, " Не хотите: toSplit = "1,Some Value,31337,Another Value, " с пробелом на конце.)

Это ошибка в String.split () и есть ли способ обхода / другой вариант?

Solutions Collecting From Web of "При обработке строки csv с пустым конечным полем myString.split (",") возвращает неправильное количество записей массива"

Выяснил это, когда я входил в вопрос! Используйте stringObj.split (",", numDelimitersExpected) или, как указывал @Supericy , stringObj.split (",", -1) .

Согласно документам Android о stringObj.split (разделитель), вызов line.split( "," ) эквивалентен вызову line.split( ",", 0 ) со вторым аргументом, относящимся к limit , который устанавливает « Максимальное количество записей » и определяет « обработку конечных пустых строк ». Рассматривая документацию для stringObj.split (разделитель), она заявляет, что с limit == 0 ' конечные пустые строки не будут возвращены '.

Решение заключается в использовании вызова split( ",", limit ) с limit установленным на количество записей массива, которое вы ожидаете получить . В моем случае ограничение, установленное на 5, возвращает массив

 values[0] : '1' values[1] : 'Some Value' values[2] : '31337' values[3] : 'Another Value' values[4] : '' 

Что я и хотел. Задача решена.

Фактически, даже если ваша строка toSplit имеет меньше разделителей, чем limit , вызов с установленным limit все равно будет создавать пустые записи массива до limit . Например, с той же вводной строкой, что и в моем вопросе:

 String toSplit = "1,Some Value,31337,Another Value," 

Вызов String values[] = toSplit.split( ",", 8 ) возвращает массив

 values[0] : '1' values[1] : 'Some Value' values[2] : '31337' values[3] : 'Another Value' values[4] : '' values[5] : '' values[6] : '' values[7] : '' 

Ухоженная!

Примечание. Oracle String.split (разделитель) Oracle имеет те же функциональные возможности, что и у Android-docs, за их более сжатые объяснения. (:

Изменить: по мере добавления @Supericy, toSplit.split( ",", -1 ) также правильно вернет конечную пустую запись . Спасибо за дополнение!