2013-05-25 9 views
8

Przetwarzam określoną linię odczytaną z pliku .csv przy użyciu String.split(",") i znajdując końcowy pusty ciąg po tym, jak ostatni ogranicznik nie jest wprowadzany do tablicy utworzonej przez funkcję split.Podczas przetwarzania łańcucha csv z pustym polem końcowym, myString.split (",") zwraca niepoprawną liczbę wpisów tablicy

Wybrane wartości zmiennych, które powodują błąd:

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

Tablica values kończy się o mniej niż oczekiwana liczby wpisów tablicy. Matryca utworzona jest:

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

z values[4] wyrzucanie wyjątek ArrayIndexOutOfBounds.

Tablica chcę jest:

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

Jedno zastrzeżenie: Czytam wyjście innego twórcę pliku .csv i nie chcą korzystać z ograniczników sznurka lub rzucać „” biały znak w miejscach, gdzie dane są puste. (tzn. nie chcę: toSplit = "1,Some Value,31337,Another Value, " z białymi znakami na końcu).

Czy jest to błąd w String.split() i czy istnieje obejście/inna opcja?

Odpowiedz

13

Wyliczyłem to, gdy wprowadzałem pytanie! Użyj stringObj.split (",", numDelimitersExpected) lub, jak podkreślił @Supericy, stringObj.split (",", -1).

Według Android Dokumenty około stringObj.split(delimiter) wywołanie line.split(",") odpowiada wywołaniu line.split(",", 0) z drugiego argumentu odnoszące się limit, który określa „maksymalną liczbę pozycji” i określa "leczenia końcowe puste ciągi znaków ". Patrząc na dokumentację dla stringObj.split(delimiter) stwierdza się, że z limit == 0 'końcowe ciągi puste nie będą zwracane'.

Rozwiązaniem jest użycie wezwanie do split(",", limit) z limit zestaw do liczby wpisów tablicy można oczekiwać, aby wrócić. W moim przypadku limit ustawiony na 5 zwraca tablicę, która jest dokładnie tym, czego chciałem. Problem rozwiązany.

W rzeczywistości, nawet jeśli ciąg toSplit ma mniej niż limit ograniczniki, połączenie z zestawem limit będzie nadal tworzyć pustych wpisów tablicy w górę do limit. Na przykład, ten sam ciąg wejściowy jak na moje pytanie:

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

rozmowy String values[] = toSplit.split(",", 8) powraca tablicy

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

Neat!

Uwaga: Java Oracle String.split(delimiter) ma tę samą funkcjonalność, co dokumentacja wygrywająca dla systemu Android w celu uzyskania bardziej zwięzłego wyjaśnienia. (:

Edit: Jak dodaje @Supericy, toSplit.split(",", -1) również prawidłowo zwróci tyłu pusty wpis Dziękujemy za dodanie

+0

ciągu jednej minuty na pytanie i odpowiedź są obecne.! D – Lion

+2

Alternatywnie, ty może użyć 'String.split (delimiter, -1)' jeśli nie znasz liczby wpisów z wyprzedzeniem.Jednak javadoc * nie * mówi ci, że wywołuje 'String.split (del, limit)' z limitem zerowym, więc twój powód, dla którego androidy są lepsze, jest dyskusyjny – Supericy

+0

@Supericy: Dobre połączenie z limitem -1 I tak, przeczytałem, że dokumenty Oracle wyjaśniają tę funkcjonalność, ale dokumenty z Androidem robią użytek funkcjonalnej enkapsulacji, która mówi dokładnie to samo rzecz jak dokumentacja Oracle, ale bardziej zwięźle. Uwaga: nie stwierdziłem, że dokumentacja była zła, tylko że była mniej zwięzła. Oba są kompletne. Jeden jest zarówno kompletny, jak i krótszy, więc wygrywa. (: Dzięki za wkład! – reor

Powiązane problemy