stringTokenizerでテキストの行を定義済み変数に分割する最良の方法は何ですか
質問
タイトルが非常に明確であるかどうかはわかりませんが、基本的にファイルからテキスト行を読み取り、8つの異なる文字列変数に分割する必要があります。各行には、同じ順序(タイトル、著者、価格など)で同じ8つのチャンクがあります。したがって、テキストの各行について、8つの文字列になります。
最初の問題は、行の最後の2つのフィールドが存在する場合と存在しない場合があるため、stringTokenizer.hasMoreTokensで何かをする必要があります。そうしないと、フィールド7と8が存在しない場合に混乱します。
理想的にはforループの1回でそれを行いたいのですが、8(または6)個のすべての文字列を正しく入力できるように、フィールドの順序をループに伝える方法がわかりません。 8つのネストされたifステートメントを使用するより良い方法があることを教えてください!
EDIT:String.splitソリューションは間違いなくその一部のように見えるので、stringTokenizerの代わりにそれを使用します。ただし、個々の文字列をコンストラクターに入力する最善の方法はまだわかりません。最良の方法は、クラスに配列を期待させ、コンストラクタで次のようなことをすることです:
line[1] = isbn;
line[2] = title;
解決
最善の方法は、StringTokenizerをまったく使用せず、Stringの split メソッド。文字列の配列を返し、その長さを取得できます。
ファイルの各行について、次のことができます:
String[] tokens = line.split("#");
tokens
には6〜8個の文字列が含まれるようになります。 tokens.length()
を使用してその数を調べ、配列からオブジェクトを作成します。
他のヒント
正規表現が道です。 splitメソッドを使用して、受信文字列を文字列の配列に変換できます
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#split(java.lang.String)
キャプチャグループを使用した正規表現は機能しますか?式の一部をオプションにすることもできます。
1行または3行のデータの例が役立つ場合があります。
これはCSVまたは類似のファイルですか?もしそうなら、あなたを助けるライブラリがあります。例えば、 Apache Commons CSV (代替へのリンク彼らのページでも)。ファイルの各行に対してString []を取得します。配列サイズをチェックして、存在するオプションフィールドを確認してください。