String-Parsing in Java mit Trennzeichen-Tab "\ t" mit Split
Ich bin mit der Verarbeitung einer Zeichenkette, die Tabulator getrennt. Ich bin die Erfüllung dieser mithilfe der split
Funktion, und es funktioniert in den meisten Situationen. Das problem tritt auf, wenn ein Feld fehlt, also anstatt null in diesem Feld bekomme ich den nächsten Wert. Ich bin die Speicherung der analysierten Werte in einem string-array.
String[] columnDetail = new String[11];
columnDetail = column.split("\t");
Jede Hilfe würde geschätzt werden. Wenn möglich würde ich gerne speichern der analysierten strings in einem string-array, so dass ich leicht Zugang zu den analysierten Daten.
Kommentar zu dem Problem
Also
Feld1\tfield2\t\tfield4
gibt Sie Feld1,Feld2,feld4 statt Feld1,Feld2,[null],field4 ? stackoverflow.com/questions/1630092/token-parsing-in-java/... duplizieren? Dies ist, was passiert, wenn Sie NICHT die Antwort zu verstehen und einfach nur den code zu kopieren.
Sie brauchen nicht zu reservieren, ein neues string-array.
- String.split
ordnet eine neue sowieso. ?o.k.w ya eigentlich habe ich die xml-Datei, die enthält <Daten> - tag und ich muss zum Lesen der tab-seperated value.
Sie müssen verstehen, Was Sie suchen und Warum. Geben Sie die working-code für Ihr problem nicht lehren Sie nichts, Sie werden nur am Ende Fragen die gleiche Frage immer und immer wieder in verschiedenen Szenarien.
InformationsquelleAutor der Frage lakhaman | 2009-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
String.split verwendet Reguläre Ausdrücke, auch Sie brauchen nicht zu reservieren, ein extra array für die split.
Die split-Methode wird Ihnen eine Liste., das problem ist, dass Sie versuchen, pre-definieren Sie, wie viele vorkommen, haben Sie eine Registerkarte, aber wie würden Sie das Wirklich wissen? Versuchen Sie, mithilfe der Scanner-oder StringTokenizer und nur lernen, wie man splitting-strings arbeiten.
Lassen Sie mich erklären, Warum \t funktioniert nicht und warum müssen Sie
\\\\
zu entkommen\\
.Okay, also, wenn Sie Split verwenden, es tatsächlich dauert ein regex ( Regular Expression ) und im regulären Ausdruck, den Sie definieren wollen, welche Zeichen aufgeteilt, und wenn Sie schreiben, \t, die eigentlich gar nicht meine
\t
und was Sie teilen MÖCHTEN, ist\t
, richtig? Also, durch das schreiben\t
Sie sagen, Ihre regex-Prozessor, "Hey geteilt durch die Zeichen, die entkam t" NICHT "Hey, aufgeteilt nach allen Zeichen suchen, wie\t
". Den Unterschied bemerken? Mit \ bedeutet die Flucht etwas. Und\
im regex bedeutet etwas Ganz anderes als das, was Sie denken.Also das ist, warum Sie benötigen, um dieses Lösung:
Sagen die regex-Prozessor zu suchen \t. Okay, also warum würden Sie brauchen, zwei-em? Gut, die erste \ entgeht der zweiten, was bedeutet, es wird wie folgt Aussehen: \t wenn Sie die Bearbeitung des Textes!
Lassen Sie uns jetzt sagen, dass Sie auf der Suche nach split \
Gut, dann würden Sie sich Links mit \\, aber sehen Sie, das Funktioniert nicht! da \ wird versuchen zu fliehen, den bisherigen char! Das ist, warum Sie möchten, dass der Ausgang zu sein, \ \ und deshalb Sie brauchen, um \\\\.
Ich hoffe wirklich, dass die Beispiele oben genannten Ihnen hilft zu verstehen, warum Ihre Lösung funktioniert nicht, und wie Sie erobern, andere lieben!
Nun, ich habe Euch diese Antwort vor, vielleicht sollten Sie beginnen, Sie jetzt.
ANDEREN METHODEN
StringTokenizer
Sollten Sie schauen in die StringTokenizer, es ist ein sehr nützliches Werkzeug für diese Art von Arbeit.
Beispiel
Dieser Ausgabe wird
Verwenden Sie die Zweite Konstruktor StringTokenizer um die Trennzeichen:
StringTokenizer(String str, String delim)
Scanner
Können Sie auch ein Scanner als einer der Kommentatoren sagte, dies könnte ähnlich Aussehen, wie diese
Beispiel
Die Ausgabe wäre
Bedeutung, es wird geschnitten, das Wort "Fisch" und geben Sie den rest, mit "Fisch" als Trennzeichen.
Beispiele aus der Java-API
InformationsquelleAutor der Antwort Filip Ekberg
Versuchen Sie dies:
Lesen der Javadoc auf String.split(java.lang.String, int) für eine Erklärung zu den limit-parameter der split-Funktion:
Wenn die letzten Felder (I Gast, der Ihre situation) fehlt, erhalten Sie die Spalte wie folgt:
Wenn ist keine Grenze gesetzt, split(), das limit ist 0, was dazu führen wird, dass "leere strings verworfen werden". So können Sie genau bekommen nur 3 Felder, {"Feld1", "Feld2", "feld3"}.
Wenn limit auf -1 gesetzt, ein nicht-positiver Wert, leere Zeichenketten werden nicht verworfen. So können Sie 5 Felder mit den letzten zwei, leerer string, {"Feld1", "Feld2", "feld3", "", ""}.
InformationsquelleAutor der Antwort Happy3
Gut niemand antwortete, - das ist zum Teil die Schuld der Frage : ist der input-string enthält elf Felder (so viel abgeleitet werden kann), aber wie viele tabs ? Vielleicht genau 10. Dann ist die Antwort
Wenn die Felder passieren Tabulatoren enthalten, das wird nicht funktionieren, wie erwartet, natürlich.
Die
-1
bedeutet : übernehmen Sie die Muster so oft wie nötig - so nachfolgende Felder aus (die 11.) werden erhalten (als leere Zeichenfolgen (""
), wenn nicht vorhanden, die müssen ausgeschaltet werden, umnull
explizit).Wenn auf der anderen Seite gibt es keine tabs für die fehlenden Felder - so
"5\t6"
ist eine gültige Eingabe-string, der die Felder 5,6 nur - es gibt keinen Weg, um diefields[]
über split.InformationsquelleAutor der Antwort Mr_and_Mrs_D
String.split
Implementierungen haben erhebliche Einschränkungen, wenn die Daten in eine durch Tabulatoren getrennte Felder selbst enthält, newline -, Tabulator-und eventuell " Zeichen.TAB-getrennte Dateiformate wurden, um für Esel Jahren, aber das format ist nicht standardisiert und variiert. Viele Implementierungen nicht escape-Zeichen (Zeilenumbrüche und tabs), die innerhalb eines Feldes. Eher, Sie Folgen CSV-Konventionen und wickeln Sie jede nicht-triviale Felder in "doppelten Anführungszeichen". Dann fliehen Sie nur double-quotes. So ein "Linie" - erweitern konnte über mehrere Zeilen.
Lesen herum hörte ich "einfach wiederverwenden von apache-tools", das klingt wie gute Ratschläge.
Am Ende habe ich persönlich wählte opencsv. Ich fand es leicht, und da stellt es Optionen für die escape-und quote-Zeichen umfassen sollte beliebtesten Komma - und Tabulator - getrennte Daten-Formate.
Beispiel:
InformationsquelleAutor der Antwort Luke Usherwood
Ich hatte gerade die gleiche Frage und bemerkte die Antwort in einer Art tutorial. Im Allgemeinen müssen Sie verwenden die zweite form der split-Methode, mit der
split(regex, limit)
Hier ist das gesamte tutorial http://www.rgagnon.com/javadetails/java-0438.html
Wenn Sie einige negative Zahl für den limit-parameter erhalten Sie leere strings in dem array, in dem die tatsächlichen Werte fehlen. Verwenden Sie diese Ihre erste string sollte zwei Kopien des Trennzeichen, das heißt, Sie sollten haben \t\t wo die Werte fehlen.
Hoffe, das hilft 🙂
InformationsquelleAutor der Antwort Ivan Marinov