2013-09-04 11 views
6

Ho un file con informazioni al suo interno. Sembra che:Come dividere le stringhe in un file e leggerle?

Michael 19 180 Miami 
    George 25 176 Washington 
    William 43 188 Seattle 

voglio dividere le linee e archi e leggerli. Voglio farlo sembrare come:

Michael 
    19 
    180 
    Miami 
    George 
    ... 

ho usato un codice come questo:

BufferedReader in = null; 
    String read; 
    int linenum; 
    try{ 
     in = new BufferedReader(new FileReader("fileeditor.txt")); 
    } 
    catch (FileNotFoundException e) {System.out.println("There was a problem: " + e);} 
    try{ 
     for (linenum = 0; linenum<100; linenum++){ 
      read = in.readLine(); 
      if(read == null){} 
      else{ 
       String[] splited = read.split("\\s+"); 
       System.out.println(splited[linenum]); 
      } 
     } 
    } 
    catch (IOException e) {System.out.println("There was a problem: " + e);} 
} 

Ciò che questo ha dato a me era

Michael 
    25 
    188 

penso che la sua, probabilmente un problema con il mio ciclo for ma non sono molto avanzato nella programmazione e apprezzerò l'aiuto. Grazie.

risposta

5

Sei part di là che è fantastico.

Durante la lettura di un file, Reader restituisce null quando raggiunge la fine dello stream, ovvero non è disponibile altro da leggere. Il tuo approccio attuale significa che vuoi leggere almeno 100 righe, ma non di più ... questo diventerà problematico in futuro se aumenti le dimensioni del file ... è anche un po 'dispendioso

Invece, dovremmo usare il fatto un valore null indica la fine del file ..

Quando si divide una linea, conterrà un numero di elementi. Si sta utilizzando la variabile linenum per stamparli. Il problema è che hai già letto e diviso la linea, lo linenum è irrilevante per questa attività, poiché rappresenta il numero di linee che hai già letto, non la parte della stringa che hai appena diviso.

Invece, è necessario utilizzare un ciclo interno per visualizzare i singoli elementi di divisione per ogni linea ...

Per esempio ...

BufferedReader in = null; 
try { 
    in = new BufferedReader(new FileReader("fileeditor.txt")); 
    String read = null; 
    while ((read = in.readLine()) != null) { 
     String[] splited = read.split("\\s+"); 
     for (String part : splited) { 
      System.out.println(part); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("There was a problem: " + e); 
    e.printStackTrace(); 
} finally { 
    try { 
     in.close(); 
    } catch (Exception e) { 
    } 
} 

Inoltre, non dimenticare, se si aprirlo, muffa chiuderlo;)

si potrebbe desiderare di prendere un po 'più di tempo passando attraverso Basic I/O pure;)

2
String[] splited = read.split("\\s+"); 
    for (int i= 0; i<splited.length; i++){ 
    System.out.println(splited[i]); 
    } 

Si dovrebbe eseguire il loop del risultato dopo aver diviso la stringa.

1

è possibile utilizzare un StreamTokenizer. Divide un flusso in token secondo le sue impostazioni. Dalla tua domanda penso che tu voglia trattare le terminazioni di linea come separatori di token. Il codice sarebbe simile a questa:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.StreamTokenizer; 

public class ReaderSample { 

    public static void main(String[] args) { 
     BufferedReader in = null; 
     try { 
      in = new BufferedReader(new FileReader("fileeditor.txt")); 
      StreamTokenizer st = new StreamTokenizer(in); 
      st.eolIsSignificant(false); 
      // remove comment handling 
      st.slashSlashComments(false); 
      st.slashStarComments(false); 

      while(st.nextToken() != StreamTokenizer.TT_EOF) { 
       if (st.ttype == StreamTokenizer.TT_NUMBER) { 
        // the default is to treat numbers differently than words 
        // also the numbers are doubles 
        System.out.println((int)st.nval); 
       } 
       else { 
        System.out.println(st.sval); 
       } 
      } 
     } 
     catch(IOException ex) { 
      System.err.println(ex.getMessage()); 
     } 
     finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } 
       catch (IOException ex) { 
       } 
      } 
     } 
    } 
} 

A seconda di ciò che è necessario fare woth l'ingresso potrebbe essere necessario impostare diverse opzioni, la documentazione dovrebbe aiutare qui.

+0

In secondo luogo, l'utilizzo di uno 'Scanner' sembra essere migliore. 'StreamTokenizer' è obsoleto. –

Problemi correlati