L’analisi delle stringhe in Java con delimitatore scheda “\t” con split

Io sono l’elaborazione di una stringa, che è delimitato da tabulazione. Sto compiendo questa operazione utilizzando il split funzione, e funziona nella maggior parte delle situazioni. Il problema si verifica quando un campo è mancante, così, invece di ottenere il valore null nel campo ottengo il valore successivo. Sto mantenendo il analizzati i valori in un array di stringhe.

String[] columnDetail = new String[11];
columnDetail = column.split("\t");

Qualsiasi aiuto sarebbe apprezzato. Se possibile, mi piacerebbe negozio analizzata una stringa in un array di stringhe in modo che io possa accedere facilmente ai dati analizzati.

  • Così field1\tfield2\t\tfield4 ti dà campo1,campo2,campo4 invece di campo1,campo2,[null],campo4 ?
  • stackoverflow.com/questions/1630092/token-parsing-in-java/… duplica? Questo è ciò che accade quando NON si capiscono le risposte e basta copiare e incollare il codice.
  • Non è necessario allocare un nuovo array di stringhe. String.split alloca un nuovo comunque.
  • ?o.k.w ya mi sono file xml che contiene <data> tag e ho letto la sua scheda separati valore.
  • È necessario capire che Cosa si vuole e Perché. Dando lavoro-codice per il tuo problema di solito ti insegnano nulla, si finirà solo chiedendo la stessa domanda più e più volte in diversi scenari.
InformationsquelleAutor lakhaman | 2009-10-28

 

6 Replies
  1. 84

    Stringa.split utilizza Le Espressioni Regolari, inoltre, non è necessario allocare una matrice extra per il tuo split.

    Spalato, il metodo vi darà una lista., il problema è che si tenta di pre-definire il numero di occorrenze si dispone di una scheda, ma come si può sapere che? Provare a utilizzare lo Scanner o StringTokenizer e solo imparare come dividere una stringa lavoro.

    Mi spiego Perché \t non funziona e perché avete bisogno di \\\\ per sfuggire \\.

    Okay, quindi quando si utilizza Spalato, in realtà, prende una regex ( Espressione Regolare ) e nell’espressione regolare che si desidera definire il Personaggio che per dividere, e se si scrive \t che in realtà non significa \t e ciò che si DESIDERA dividere è \t, giusto? Così, appena iscritto \t dire il tuo regex-processore “Ehi, dividi per il carattere che le è sfuggito t” NON “Ehi split da tutti i personaggi, cercando, come \t“. Notate la differenza? Utilizzando \ mezzi per sfuggire qualcosa. E \ in regex significa qualcosa di Completamente diverso da ciò che si pensa.

    Quindi questo è il motivo per cui è necessario utilizzare questo Soluzione:

    \\t

    A dire la regex processore a cercare \t. Ok, allora perché avete bisogno di due di em? Bene, il primo \ sfugge al secondo, il che significa che si avrà un aspetto simile a questo: \t quando si sta elaborando il testo!

    Ora diciamo che si sta cercando di dividere \

    Bene, allora si sarebbe lasciato con \\ ma vedi che non Funziona! perché \ cercherà di sfuggire alla precedente char! Che è il motivo per cui si desidera che l’Uscita di \\ e, pertanto, è necessario disporre \\\\.

    Spero davvero che gli esempi di cui sopra, ti aiuta a capire perché la tua soluzione non funziona e come conquistare altri!

    Ora, ho dato questo risposta prima, forse si dovrebbe iniziare a guardare la loro ora.

    ALTRI METODI

    StringTokenizer

    Si dovrebbe guardare in StringTokenizer, è uno strumento molto utile per questo tipo di lavoro.

    Esempio

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

    Questa uscita

     this
     is
     a
     test

    Si utilizza il Secondo Costruttore per StringTokenizer per impostare il delimitatore:

    StringTokenizer(String str, String delim)

    Scanner

    Si potrebbe anche usare una Scanner come uno dei commentatori ha detto che questo potrebbe sembrare un po ‘ come questo

    Esempio

     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(); 

    L’output sarebbe

     1
     2
     red
     blue 

    Significato che taglia la parola “pesce” e dare il resto, l’utilizzo di “pesce” come delimitatore.

    esempi tratti dall’API Java

    • nice one!
    • Le espressioni regolari non dovrebbe mordere quando suddivisione in scheda, però.
    • Probabilmente no, ma se l’OP solo per Provare a leggere le risposte e capire, avrebbe già conosco la risposta a questa. Perché questo è simile a quello che ha postato ieri. Direi che SE ha usato il mio metodo di ieri e di oggi, egli non avrebbe avuto questo problema.
    • Ho aggiunto un po ‘ di più per clearify perché non funziona a spalato e da \t. hth.
    • devo analizzare file xml che ha commen campo di intestazione e quindi più campi di dati, quindi se io uso stringtokenizer allora non potrete stabilito che il campo è null. ieri mi hanno sollevato il problema per i file di testo mentre oggi per il file XML. ecco perché devo avere per utilizzare la funzione split
    • Siete alla ricerca sul problema totalmente sbagliato o che si sono chiedendo il tipo sbagliato di domanda. Vorrei suggerire che invece di coinvolgere il parser e roba per leggere l’XML. Basta iniziare semplice. Si prega di fornire un Esempio e, se non vi è alcun modo per voi di utilizzare le informazioni fornite da me ( che trovo altre ), beh, allora c’è molto che posso fare per voi.
    • Il Parsing di XML con le espressioni regolari è sempre sbagliato.
    • L’output è lo stesso, se si utilizza “\t” o “\\t”, e io non sono sicuro perché sei andato in uso StringTokenizer e Scanner. Inoltre, La Stringa.spalato è molto più semplice rispetto agli altri due e per la documentazione “StringTokenizer è un retaggio di classe che viene mantenuta per ragioni di compatibilità, anche se il suo uso è sconsigliato nel nuovo codice.”
    • -1 – informazioni errate sul “\t” o “\\t” (stackoverflow.com/a/3762377/281545) – si prega di modifica
    • La cura per essere un po ‘ più specifico?
    • vedi collegato risposta
    • Puoi essere più specifico per favore? Forse qualcosa è cambiato da quando ho risposto alla domanda, poiché è stata di 3 anni. Quindi, per favore, essere più specifico. La risposta è legata non direttamente indicano che la mia risposta qui è sbagliato.
    • Stavo parlando la parte di risposta che dice che c’è una differenza tra \t e \\t in split – scusami se non sono stato chiaro 🙂
    • Non ho fatto in Java un po ‘ e non ho un IDE disponibile quindi mi limiterò a prendere la parola per esso. Sembra che sia stata la risposta corretta al momento però. Sentitevi liberi di modificare la risposta se si è certi che si tratta di un errore/out datato informazioni nella risposta
    • Grazie, cercherò di dare un voto positivo e modificare al più presto
    • che non mi permette di modificare (solo di ortografia modifiche), in modo da eliminare la parte da Let me explain Why \t does not work fino a conquer other ones!
    • Ho appena trovo strano che ha ottenuto 27 upvotes quando inizialmente ho risposto. Avrei bisogno di fare un po ‘ esplorare, prima solo la rimozione di una grossa porzione di risposta. Comunque, le persone che vengono qui sarà ora di vedere anche i commenti.
    • Mi chiedo se si pensa che OP è stato il tentativo di dividere la Stringa “\t” (un backspace seguito da ‘t’), piuttosto il carattere di tabulazione. Se “no”, quindi la prima sezione è sbagliata e mi chiedo se mai fosse vero. Non c’è bisogno di applicare il doppio sfugge per il carattere di tabulazione, una singola, va bene. La regex di per sé non ha bisogno di avere accesso alla Stringa \t (il che spiegherebbe la necessità di \\t), l’attuale scheda char (dopo \t è stato sostituito dalla corrispondente char (byte 9)). Lasciare che la regex gestire \t, fornendo così le due barre rovesciate, funziona così, ma non è obbligatorio.

  2. 20

    Provare questo:

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

    Leggere i Javadoc sul Stringa.split(java.lang.String, int) per una spiegazione circa il limite di parametro di funzione split:

    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" }

    Quando l’ultimo paio di campi (I guest che è la tua situazione) sono mancanti, si ottiene la colonna come questa:

    field1\tfield2\tfield3\t\t

    Se non viene impostato alcun limite di spalato (split), il limite è 0, il che comporterà che “trailing stringhe vuote verrà eliminato”. In modo che si possa ottenere solo 3 campi, {“campo1”, “campo2”, “campo3”}.

    Quando il limite è impostato a -1, un non-valore positivo, finali di stringhe vuote non vengono eliminate. Così si possono ottenere 5 campi con gli ultimi due sono una stringa vuota, {“campo1”, “campo2”, “campo3”, “”, “”}.

    • hai dato il link per java1.4 doc. non dobbiamo fare riferimento alla più recente versione? 🙂
  3. 6

    Bene nessuno mi ha risposto – che è in parte colpa della domanda : la stringa di input contiene undici campi (questo può essere dedotto) ma quante schede ? Più probabilmente esattamente 10. Quindi la risposta è

    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]

    Se i campi capita di contenere le schede non funzionano come previsto, naturalmente.

    Il -1 significa : applicare il modello, come tante volte quanto necessario, quindi, campi finali (11) saranno conservati (come stringhe vuote ("") se deboli, che hanno bisogno di essere trasformata per null in modo esplicito).

    Se, invece, non ci sono schede per i campi mancanti – in modo "5\t6" è un valido input stringa contenente i campi 5,6 – non c’è alcun modo per ottenere il fields[] via spalato.

    • Non è contrassegnato come accettata perché l’OP non è mai tornato indietro per il sito, dopo aver chiesto le domande.
  4. 5

    String.split implementazioni hanno gravi limitazioni, se i dati in un delimitato da tabulazioni campo contiene newline, scheda e possibilmente ” caratteri.

    Delimitato da tabulazioni formati sono stati intorno per un asino anni, ma il formato non è standardizzato e varia. Molte implementazioni non caratteri di escape (a capo, e schede) compaiono all’interno di un campo. Piuttosto, essi seguono CSV convenzioni e avvolgere qualsiasi non banale campi “virgolette”. Poi fuggono solo i doppi apici. Così una “linea” potrebbe estendersi su più righe.

    Leggendo in giro ho sentito dire “basta riutilizzare apache strumenti”, che suona come un buon consiglio.

    Alla fine ho scelto personalmente opencsv. Ho trovato la luce-peso, e in quanto fornisce opzioni per la fuga e caratteri di citazione dovrebbe coprire la maggior parte dei popolari virgola delimitato da tabulazioni e formati di dati.

    Esempio:

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

    Ho appena avuto la stessa domanda e ho notato che la risposta in una sorta di tutorial. In generale, è necessario utilizzare il secondo modulo del metodo split, utilizzando il

    split(regex, limit)

    Ecco il tutorial completo http://www.rgagnon.com/javadetails/java-0438.html

    Se è possibile impostare alcune numero negativo per il parametro limite si ottiene vuoto stringhe dell’array in cui i valori effettivi sono mancanti. Per utilizzare questa tua stringa iniziale dovrebbe avere due copie del delimitatore cioè si dovrebbe avere \t\t in cui i valori sono mancanti.

    Spero che questo aiuti 🙂

Lascia un commento