2012-07-10 17 views
13

私は区切り文字としてタブ(/ t)を使用していますスキップし、私は私のデータなどでいくつかの空のフィールドがあります知っている:のJava StringTokenizer.nextTokenは()空のフィールド

one->two->->three 

- >タブに等しいが、 。あなたが見ることができるように、空のフィールドはまだタブによって正しく囲まれています。 データは、ループを使用して収集されます。

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

はまだJavaは、この「空の文字列」を無視し、フィールドをスキップします。

この動作を回避し、空のフィールドで読み込むように強制する方法はありますか?

+4

使用 'のstring.Split(「\ tを」)'。 –

+3

StringTokenizerのJavaドキュメントから "StringTokenizerは、互換性の理由から保持されているレガシークラスですが、新しいコードで使用することはお勧めしません。この機能を求める人は、Stringのsplitメソッドまたはjava.util.regex代わりにパッケージ。 " – Inquisitive

+1

'string.split(" \ t ")'のように見えるだけで、後ろに空のトークンは返されません。それが重要であれば 'string.split(" \ t "、-1)'を使います。 – Oded

答えて

7

すべてでいただきありがとうございます。ため、私は解決策を見つけることができた最初のコメントへ: はい、あなたは正しいです、ご参考のためにありがとうございました。代わりに

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

あなたはので、それは別々の文字列として、各区切りを返しreturnDelimstrue

でコンストラクタpublic StringTokenizer(String str, String delim, boolean returnDelims)を使用することができますhttp://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html Javaのドキュメントで見ることができるように!

編集:

ませ使用をこのようにDO @npeがすでに出て入力されたとして、StringTokenizerはこれ以上を使用すべきではありません! Javadocを参照してください。

StringTokenizerは、その使用が新しいコードに落胆しているがは、互換性のために の理由を保持していることをレガシークラスです。 この機能を求める人はsplitメソッドString またはパッケージを代わりに使用することをお勧めします。

+0

私はまだブランクの値が配列に入れられていない、ブランカのフィールドを示す、複数のタブがあるという問題に直面しています。これを修正できますか? – FireFox

+0

returnDelimsは区切り文字を返します。これは質問に答えません。 –

15

ステータスWill not fixStringTokenizer号については、RFE in the Sun's bug databaseの問題があります。

このRFE状態の評価は、私は引用:

1.4.0java.util.regexパッケージの追加により、我々は は基本的にStringTokenizerの必要性を廃止持っています。互換性の理由から、 クラスは削除されません。しかし、regexは、必要なものを簡単に提供します。

そして、String#split(String)メソッドを使用することを提案します。

1

私はすべての大きな正規表現の機械を必要とせず、より多くの文字列のsplit()方法よりも行儀されGuava's Splitterを、使用します。

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

私には妄想がありますが、私は本当に単純なこと(標準ライブラリには言及していません)に新しい依存関係を導入するとは思わないと思います。私はまだ正規表現を必要としないGuavaスプリッタに関する情報に感謝しています:) – posdef

+0

Guavaはとても役に立ちます。非常に小さな自蔵ライブラリ)。 –

+0

グアバは素晴らしいですね。私はまだGuavaであるawesomenessを完全に探検しなかったので、それについて新しいことを学ぶことは常にいいです。 – posdef