Bei der Verarbeitung einer CSV-Zeichenfolge mit einem leeren letzten Feld gibt myString.split (",") eine falsche Anzahl von Array-Einträgen zurück

8

Ich verarbeite eine bestimmte Zeilenlesung aus einer CSV-Datei mit String.split(",") und stelle fest, dass die letzte leere Zeichenkette nach dem letzten Trennzeichen nicht in das von der Funktion split erstellte Array mündet.

Hier sind die Variablenwerte, die den Fehler verursachen:

%Vor%

Das Array values hat weniger als die erwartete Anzahl von Array-Einträgen. Das erzeugte Array ist:

%Vor%

mit einer values[4] , die eine ArrayIndexOutOfBounds-Ausnahme auslöst.

Das Array, das ich möchte, ist:

%Vor%

Eine Einschränkung: Ich lese die Ausgabe eines anderen .csv-Datei-Erstellers und möchte keine String-Begrenzer verwenden oder ein Leerzeichen an Orten ausgeben, an denen die Daten leer sind. (dh nicht wollen: toSplit = "1,Some Value,31337,Another Value, " mit Leerzeichen am Ende.)

Ist das ein Fehler in String.split () und gibt es eine Problemumgehung / eine andere Option?

    
reor 25.05.2013, 23:59
quelle

1 Antwort

13

Ich habe es herausgefunden, als ich die Frage gestellt habe! Verwenden Sie stringObj.split (",", numDelimitersExpected) oder, wie @Supericy darauf hingewiesen hat, stringObj.split (",", -1) .

Laut den Android-Dokumenten über stringObj.split (Begrenzer) entspricht ein Aufruf von line.split( "," ) einem Aufruf von line.split( ",", 0 ) mit dem zweiten Argument, das sich auf limit bezieht, wodurch die maximale Anzahl von Einträgen festgelegt und definiert wird die ' Behandlung von nachgestellten leeren Strings '. Schauen Sie sich die Dokumentation für stringObj.split (delimiter) es besagt, dass mit limit == 0 ' nachgestellte leere Zeichenfolgen nicht zurückgegeben werden '.

Die Lösung besteht darin, einen Aufruf von split( ",", limit ) mit limit auf die Anzahl von Array-Einträgen zu setzen, von denen Sie erwarten, dass sie zurückkommen . In meinem Fall gibt ein auf 5 gesetztes Limit das Array zurück

%Vor%

was genau ich wollte. Problem gelöst.

Selbst wenn Ihre toSplit -Zeichenfolge weniger Trennzeichen hat als limit , erzeugt ein Aufruf mit einem gesetzten limit noch immer leere Array-Einträge bis zu limit . Zum Beispiel mit der gleichen Eingabezeichenfolge wie in meiner Frage:

%Vor%

Ein Aufruf String values[] = toSplit.split( ",", 8 ) gibt das Array

zurück %Vor%

Ordentlich!

Hinweis: Oracles Java String .split (Begrenzer) hat die gleiche Funktionalität wie die Android-Dokumente, die für ihre prägnantere Erklärung gewinnen. (:

Bearbeiten: Wenn @Supericy hinzugefügt wurde, würde toSplit.split( ",", -1 ) auch den nachfolgenden leeren Eintrag korrekt zurückgeben . Danke für den Zusatz!

    
reor 25.05.2013, 23:59
quelle