2013-09-04 17 views
6

Mam plik z informacjami. Wygląda to następująco:Jak podzielić łańcuchy w pliku i je przeczytać?

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

Chcę podzielić linie i ciągi i je przeczytać. Chcę, żeby wyglądać tak:

Michael 
    19 
    180 
    Miami 
    George 
    ... 

użyłem kodu:

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

Co to dało mi było

Michael 
    25 
    188 

myślę jego prawdopodobnie problem z moim dla pętli ale nie jestem zbyt zaawansowany w programowaniu i doceniam pomoc. Dzięki.

Odpowiedz

5

Jesteś w drodze, która jest świetna.

Po odczytaniu pliku Reader zwróci null po dotarciu do końca strumienia, co oznacza, że ​​nic innego nie będzie dostępne do odczytania. Twoje obecne podejście oznacza, że ​​chcesz przeczytać co najmniej 100 wierszy, ale nie więcej ... to będzie problematyczne w przyszłości, jeśli zwiększysz rozmiar pliku ... jest to również nieco nieekonomiczne

Zamiast tego powinniśmy użyć tego faktu wartość null wskazuje koniec pliku.

Po podzieleniu linii będzie ona zawierała wiele elementów. Używasz zmiennej linenum, aby je wydrukować. Problem polega na tym, że już przeczytałeś i podzieliłeś linię, linenum jest nieistotny dla tego zadania, ponieważ reprezentuje liczbę linii, które już przeczytałeś, a nie część właśnie podzielonego ciągu.

Zamiast tego trzeba użyć wewnętrzną pętlę, aby wyświetlić poszczególne elementy podzielone na każdej linii ...

Na przykład ...

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) { 
    } 
} 

Ponadto, nie zapomnij, jeśli ciebie go otworzyć, należy go zamknąć stęchlizny;)

Możesz chcieć zająć trochę więcej czasu przechodzi Basic I/O jak dobrze;)

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

Powinieneś zapętlić wynik po podzieleniu napisu.

1

można użyć StreamTokenizer. Podział strumienia na żetony zgodnie z ustawieniami. Z twojego pytania myślę, że chcesz traktować zakończenia linii jako separatory znaczników. Kod będzie wyglądać następująco:

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) { 
       } 
      } 
     } 
    } 
} 

W zależności od tego, co trzeba zrobić, stac na wejściu może trzeba ustawić różne opcje, dokumentacja powinna pomóc tutaj.

+0

W drugiej chwili użycie "skanera" wydaje się lepsze. "StreamTokenizer" jest nieaktualny. –