2012-07-10 18 views
13

Tôi đang sử dụng một tab (/ t) là dấu phân cách và tôi biết có một số lĩnh vực có sản phẩm nào trong dữ liệu ví dụ của tôi:Java StringTokenizer.nextToken() bỏ qua trên các lĩnh vực có sản phẩm nào

one->two->->three 

đâu -> bằng tab . Như bạn có thể thấy một trường trống vẫn được bao quanh một cách chính xác bởi các tab. Dữ liệu được thu thập bằng cách sử dụng vòng lặp:

while ((strLine = br.readLine()) != null) { 
    StringTokenizer st = new StringTokenizer(strLine, "\t"); 
    String test = st.nextToken(); 
    ... 
    } 

Tuy nhiên, Java bỏ qua "chuỗi rỗng" này và bỏ qua trường này.

Có cách nào để phá vỡ hành vi này và buộc java phải đọc trong các trường trống không?

+4

Sử dụng 'String.split ("\ t") 'để thay thế. –

+3

từ tài liệu java của String tokenizer "StringTokenizer là một lớp kế thừa được giữ lại vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Khuyến cáo rằng bất kỳ ai tìm kiếm chức năng này đều sử dụng phương thức tách của String hoặc java.util.regex thay vào đó. " – Inquisitive

+1

Chỉ cần một người đứng đầu lên rằng nó trông giống như bằng cách sử dụng 'string.split (" \ t ")' sẽ không trả lại bất kỳ thẻ trống rỗng cuối cùng ở cuối. Nếu điều đó quan trọng, hãy sử dụng 'string.split (" \ t ", -1)'. – Oded

Trả lời

7

Cảm ơn bạn chút nào.Do những nhận xét đầu tiên tôi đã có thể tìm ra một giải pháp: Có bạn là đúng, cảm ơn bạn để bạn tham khảo:

Scanner s = new Scanner(new File("data.txt")); 
while (s.hasNextLine()) { 
     String line = s.nextLine(); 
     String[] items= line.split("\t", -1); 
     System.out.println(items[5]); 
     //System.out.println(Arrays.toString(cols)); 
} 
0

Như bạn có thể nhìn thấy trong Java Doc http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html bạn có thể sử dụng Constructor public StringTokenizer(String str, String delim, boolean returnDelims) với returnDelimstrue

Vì vậy, nó sẽ trả về mỗi Delimiter như là một chuỗi riêng biệt!

Edit:

KHÔNG sử dụng cách này, như @npe đã đánh ra, StringTokenizer nên không được sử dụng nữa! Xem javadoc:

StringTokenizer là một lớp học di sản mà được giữ lại để tương thích lý do mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Đó là khuyến cáo rằng bất kỳ ai tìm kiếm chức năng này sử dụng phương pháp split của String hoặc gói java.util.regex thay thế.

+0

Tôi vẫn phải đối mặt với vấn đề mà tôi có nhiều tab đằng sau eachother (chỉ ra blanc lĩnh vực) rằng giá trị trống là không đưa vào mảng .. làm thế nào tôi có thể sửa lỗi này? – FireFox

+0

returnDelims trả về dấu phân tách. Điều này không trả lời câu hỏi. –

15

Có một số RFE in the Sun's bug database về vấn đề này StringTokenizer với trạng thái Will not fix.

Việc đánh giá này bang RFE, tôi trích dẫn:

Với việc bổ sung các gói java.util.regex trong 1.4.0, chúng tôi có cơ bản lỗi thời nhu cầu StringTokenizer. Chúng tôi sẽ không xóa lớp học vì lý do tương thích. Nhưng regex cung cấp cho bạn những gì bạn cần.

Và sau đó đề xuất sử dụng phương thức String#split(String).

1

Tôi sẽ sử dụng Guava's Splitter, mà không cần phải tất cả các máy móc regex lớn, và được well-behaved hơn phương pháp split() Chuỗi của:

Iterable<String> parts = Splitter.on('\t').split(string); 
+3

gọi tôi hoang tưởng nhưng tôi thực sự không nghĩ rằng việc giới thiệu một sự phụ thuộc mới cho một cái gì đó rất đơn giản (chưa kể đến trong thư viện chuẩn) là một chút quá mức cần thiết. Tôi vẫn đánh giá cao thông tin liên quan đến bộ chia Guava không cần regex tho :) – posdef

+0

Tôi đồng ý, nhưng Guava rất hữu ích và cung cấp rất nhiều lớp hữu ích bổ sung mà nó là một phần của phụ thuộc "mặc định" của tôi cho gần như tất cả các dự án của tôi (trừ khi đó là thư viện rất nhỏ). –

+0

Ổi là tuyệt vời, chắc chắn. Tôi vẫn havent khám phá đầy đủ các awesomeness đó là ổi, do đó nó luôn luôn là tốt đẹp để tìm hiểu những thứ mới về nó. – posdef

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