目次> 第14章> 14.3 | TOPUPPREVNEXT |
各行のデータが、コンマで区切られているファイルを CSV (Comma Separated Values) と呼びます。 行をレコード、コンマで区切られた部分をフィールドといいます。
CSVファイルの例
例(1) | 例(2) |
---|---|
10220123,阿部 明子,40,55,C
10220135,加藤 勝男,43,89,B 10420082,佐藤 聡,30,0,D 30130273,田中 玉緒,100,87,A -,中村 奈々,82,65,B 99420321,羽田 花子,41,63,C |
青木一郎,東京都港区,03-3333-4444
石井次郎,神奈川県藤沢市,0462-99-8888 上田三四郎,茨城県古河市,0280-55-6666 江本吾朗,三重県津市,059-224-9999 |
データを区切る文字をセパレータとかデリミタといいます。 セパレータには通常コンマが用いられますが、データにコンマが含まれる場合など、 タブや空白が用いられる場合もあります。 文字列を引用符(")で括る場合もあります。
CSVであれば、1行分を java.util.StringTokenizer クラスに渡し、
nextToken メソッドを用いるとデリミタまでのデータが得られます。
データの個数分だけ nextToken を繰り返し呼び出します。
データの個数がわからない場合は、 hasMoreToken を参照すれば、
データの有無が調べられます。
この感覚は、Iterator インターフェースの
hasNext と next に似ています。
nextToken メソッドを呼び出すと文字列が得られるので、
そのまま文字列として使用するか、
Integer.parseInt や
Double.parseDouble などで
必要なデータ変換を行います。
StringTokenizer はデリミタが連続して現れると、 1つのデリミタとみなします。空白をデリミタとした場合などは便利ですが、 CSVのフィールドが空になって、デリミタが連続するとフィールドの位置がずれてしまいます。
J2SE 5.0 以降は、StringTokenizer の代わりに、
String クラスの split メソッドの使用が奨励されています。
【例3】【例4】
逆に、split メソッドでは連続したデリミタを1つのデリミタとする工夫が必要です。
【例6】
プログラム CsvDemo1.java
実行結果
データ・ファイル phone.txt
コマンドラインのパラメータにファイル名を指定できるようにしてあります。
指定がない場合には、phone.txt を仮定します。
プログラム CsvDemo2.java
実行結果
データ・ファイル exam.txt
ファイル名の指定がない場合には、exam.txt から読むようになっています。
J2SE 5.0 では正規表現が導入され、 String クラスに、文字列を正規表現で区切るメソッドが追加されました。
たとえば、上記【例2】で、
プログラム CsvDemo2T.java
実行結果は変わりません。
CsvDemo2T.java を実行した時の様子を
アニメーションにしてみました。
黒と青の部分が、メモリ内に作られるモノのイメージです。赤は補足説明です。
代入を繰り返し、参照できないオブジェクトがメモリ上に残りますが、
javaのシステムが適宜回収し、メモリを再利用します。この処理をガーベージ・コレクションといいます。
まず、データの作成をしましょう。 Microsoft Excel 2003 でデータを作成し、
空のフィールドがありますから、【例3】のプログラムを修正してこのファイルを読んでみましょう。 変更点は、
プログラム CsvDemo2Texcel.java
実行結果は変わりません。
上図の最後の行は、式の計算値が出力される様子を確認したものです。 1 と 2 は数字ですが、3が表示されているセル(C8)には「 =A8+B8 」という式が入っています。
プログラム CsvDemo7Texcel.java
実行結果
入力ファイル csvdata.txt
プログラム CsvDemo8T.java
実行結果
Javaの正規表現については、 java.util.regex.Pattern を参考にしてください。 文字列内にエスケープ文字(\)を書く場合には、\\ とすることに注意してください。
更新日:2006-03-10 | TOPUPPREVNEXT |