Donnerstag, Juni 4, 2020

String Parsen in Java mit Trennzeichen Tabulator „\t“ Verwendung von 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.

  • So field1\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 lakhaman | 2009-10-28

6 Kommentare

  1. 84

    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:

    \\t

    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

     StringTokenizer st = new StringTokenizer("this is a test");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }

    Dieser Ausgabe wird

     this
     is
     a
     test

    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

     String input = "1 fish 2 fish red fish blue fish";
    
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
    
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
    
     s.close(); 

    Die Ausgabe wäre

     1
     2
     red
     blue 

    Bedeutung, dass es geschnitten wird, das Wort „Fisch“ und geben Sie den rest, mit „Fisch“ als Trennzeichen.

    Beispiele aus der Java-API

    • nice one!
    • Reguläre Ausdrücke sollten nicht beißen, wenn man unter der Registerkarte, obwohl.
    • Wahrscheinlich nicht, aber wenn die OP nur Versuchen würde, um die Antworten zu Lesen und zu verstehen, er würde bereits wissen, die Antwort auf diese Frage. Denn das ist anderes zu dem, was er gestern gepostet. Ich würde sagen, dass, WENN er verwendet meine Methode gestern und heute, er würde nicht bekommen haben dieses problem.
    • Ich habe einige mehr clearify warum es nicht funktioniert split mit \t. hth.
    • ich parse xml-Datei, die commen-header-Feld und dann mehrere Daten Felder so, wenn ich stringtokenizer dann kann ich nicht festgestellt, dass das Feld null ist. ich habe gestern schon angesprochene problem für die text-Datei, während es heute für die XML-Datei. das ist, warum ich müssen zu benutzen, split-Funktion
    • Sie sind auf der Suche auf das problem Total falsch oder du fragst die falsche Art von Frage. Ich würde vorschlagen, dass statt mit Parser und Sachen zum Lesen der XML. Nur einfach starten. Bitte geben Sie uns ein Beispiel und wenn es keine Möglichkeit für Sie, verwenden Sie die Informationen von mir ( die ich finden doubtfull ), gut dann gibt es nicht viel, was ich für Sie tun kann.
    • Parsen von XML mit regulären Ausdrücken ist immer falsch.
    • Die Ausgabe ist die gleiche, wenn Sie „\t“ oder „\\t“, und ich bin nicht sicher, warum Sie ging in mit StringTokenizer und Scanner. Auch String.split ist viel einfacher als die anderen beiden und pro-Dokumentation „StringTokenizer ist ein Vermächtnis Klasse, beibehalten aus Gründen der Kompatibilität obwohl seine Verwendung wird abgeraten, in den neuen code.“
    • -1 – falsche info auf „\t“ oder „\\t“ (stackoverflow.com/a/3762377/281545), bitte Bearbeiten
    • Sorgfalt ein bisschen genauer sein?
    • finden Sie in der verlinkten Antwort
    • Können Sie das konkretisieren, bitte? Vielleicht etwas geändert, seit ich das erste beantwortet die Frage, da es schon 3 Jahre. Also bitte, etwas konkreter sein. Die Antwort, die Sie verlinkt nicht direkt darauf hinweisen, dass meine Antwort hier ist falsch.
    • Ich Sprach über den Teil Ihrer Antwort, die sagt, dass es einen Unterschied zwischen \t und \\t im split – sorry, wenn ich unklar war 🙂
    • Noch nicht getan, Java in eine Weile, und ich habe keine IDE zur Verfügung, so werde ich nur haben, um Ihr Wort für es. Es scheint, es war die richtige Antwort auf die Zeit wenn. Fühlen Sie sich frei zu Bearbeiten, die Antwort, wenn Sie sicher sind, dass es ein Fehler/veraltete Informationen in der Antwort
    • Vielen Dank – ich upvote und so schnell wie möglich Bearbeiten
    • Sie pflegen lassen Sie mich Bearbeiten (nur Rechtschreib-edits) – löschen Sie einfach den Teil aus Let me explain Why \t does not work bis zu conquer other ones!
    • Ich finde es einfach seltsam, dass es got 27 upvotes als ich ursprünglich geantwortet. Ich hätte tun müssen, etwas erforschen, bevor Sie entfernen nur einen großen Teil der Antwort. Na ja, die Leute kommen hier jetzt sehen die Kommentare so gut.
    • Ich Frage mich, ob Sie dachten, dass die OP wurde versucht, die split auf den String „\t“ (ein backspace gefolgt von ‚t‘), dann lieber das tab-Zeichen. Wenn „Nein“, dann der erste Abschnitt ist falsch und ich Frage mich, ob es jemals wahr waren. Sie brauchen nicht zu doppelten escapes für das tab-Zeichen ein einziger ist in Ordnung. Der regex selbst nicht benötigen, um Zugriff auf den String \t (das würde erklären, die Notwendigkeit für \\t), dem aktuellen tab char (nach \t ersetzt wurde durch den entsprechenden char (byte 9)). Die Vermietung der regex Griff \t somit zwei umgekehrte Schrägstriche, die so gut funktioniert, ist aber nicht erforderlich.

  2. 20

    Versuchen Sie dies:

    String[] columnDetail = column.split("\t", -1);

    Lesen der Javadoc auf String.split(java.lang.String, int) für eine Erklärung zu den limit-parameter der split-Funktion:

    split
    
    public String[] split(String regex, int limit)
    Splits this string around matches of the given regular expression.
    The array returned by this method contains each substring of this string that is terminated by another substring that matches the given expression or is terminated by the end of the string. The substrings in the array are in the order in which they occur in this string. If the expression does not match any part of the input then the resulting array has just one element, namely this string.
    
    The limit parameter controls the number of times the pattern is applied and therefore affects the length of the resulting array. If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter. If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.
    
    The string "boo:and:foo", for example, yields the following results with these parameters:
    
    Regex   Limit   Result
    :   2   { "boo", "and:foo" }
    :   5   { "boo", "and", "foo" }
    :   -2  { "boo", "and", "foo" }
    o   5   { "b", "", ":and:f", "", "" }
    o   -2  { "b", "", ":and:f", "", "" }
    o   0   { "b", "", ":and:f" }

    Wenn die letzten Felder (I Gast, der Ihre situation) fehlt, erhalten Sie die Spalte wie folgt:

    field1\tfield2\tfield3\t\t

    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“, „“, „“}.

    • Sie gab link zu java1.4 doc. sollten wir nicht Lesen mehr neuste version? 🙂
  3. 6

    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

    String s = "\t2\t\t4\t5\t6\t\t8\t\t10\t";
    String[] fields = s.split("\t", -1);  //in your case s.split("\t", 11) might also do
    for (int i = 0; i < fields.length; ++i) {
        if ("".equals(fields[i])) fields[i] = null;
    }
    System.out.println(Arrays.asList(fields));
    //[null, 2, null, 4, 5, 6, null, 8, null, 10, null]
    //with s.split("\t") : [null, 2, null, 4, 5, 6, null, 8, null, 10]

    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, um null 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 die fields[] über split.

    • Es ist nicht markiert, da angenommen werden kann, weil der OP nie wieder auf der Website nach, Fragen zu stellen.
  4. 5

    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:

    CSVReader tabFormatReader = new CSVReader(new FileReader("yourfile.tsv"), '\t');
  5. 1

    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 🙂

Kostenlose Online-Tests