2013-09-04 68 views
6

Tôi có một tệp có thông tin trong đó. Có vẻ như:Cách tách các chuỗi trong một tệp và đọc chúng?

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

Tôi muốn chia các dòng và chuỗi và đọc chúng. Tôi muốn nó trông giống như:

Michael 
    19 
    180 
    Miami 
    George 
    ... 

tôi đã sử dụng mã như thế này:

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

Điều này đã cho tôi là

Michael 
    25 
    188 

Tôi nghĩ rằng có lẽ nó là một vấn đề với cho tôi vòng lặp nhưng tôi không giỏi về lập trình và tôi sẽ đánh giá cao sự giúp đỡ. Cảm ơn.

Trả lời

5

Bạn là một phần trong đó tuyệt vời.

Khi đọc tệp, Reader sẽ trả về null khi đến cuối luồng, nghĩa là không có gì khác để đọc. Cách tiếp cận hiện tại của bạn có nghĩa là bạn muốn đọc ít nhất 100 dòng, nhưng không còn ... điều này sẽ trở nên có vấn đề trong tương lai nếu bạn tăng kích thước tệp ... nó cũng hơi lãng phí

Thay vào đó, chúng ta nên sử dụng thực tế a null giá trị cho biết phần cuối của tệp ..

Khi bạn chia một dòng, nó sẽ chứa một số phần tử. Bạn đang sử dụng biến số linenum để in các biến này. Vấn đề là, bạn đã đọc và chia dòng, linenum không liên quan đến tác vụ này, vì nó đại diện cho số dòng bạn đã đọc, không phải là một phần của chuỗi bạn vừa tách ra.

Thay vào đó, bạn cần phải sử dụng một vòng lặp bên trong để hiển thị các yếu tố phân chia riêng cho mỗi dòng ...

Ví dụ ...

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

Ngoài ra, đừng quên, nếu bạn mở nó, bạn gần mốc nó;)

bạn có thể muốn mất thêm một chút thời gian đi qua Basic I/O cũng;)

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

Bạn nên lặp lại kết quả sau khi bạn chia chuỗi.

1

bạn có thể sử dụng một StreamTokenizer. Nó sẽ chia một dòng thành các thẻ theo cài đặt của nó. Từ câu hỏi của bạn, tôi nghĩ rằng bạn muốn xử lý kết thúc dòng giống như dấu phân tách mã thông báo. Mã sẽ trông giống như sau:

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

Tùy thuộc vào những gì bạn cần làm với đầu vào bạn có thể cần đặt các tùy chọn khác nhau, tài liệu sẽ giúp bạn tại đây.

+0

Suy nghĩ thứ hai sử dụng 'Máy quét' có vẻ tốt hơn. 'StreamTokenizer' đã lỗi thời. –

Các vấn đề liên quan