CSV(Comma Separated Value)を扱うクラス
CSVTokenizer & CSVLine

安藤友晴<tomoharu@wakhok.ac.jp>
Version 1.0.1
1999.4.14


ダウンロード (Version 1.0.1)


API Documents はこちらです。

  1. はじめに
  2. CSVとは?
  3. 構成内容
  4. クラスの概要
  5. 必要な環境
  6. インストール
  7. 使用例1: 1行のCSV形式のデータを解析し、それぞれの項目を出力する。
  8. 使用例2: エンクォートされた文字列を解析する。
  9. 使用例3: データを集め、CSV形式にして書き出す。
  10. このライブラリに関する情報源
  11. 更新履歴
  12. 今後の計画について
  13. おわりに

1. はじめに

jp.ac.wakhok.tomoharu.csv パッケージは、CSV(Comma Separated Value)を扱うためのクラスライブラリです。もともと、田村健人氏がJavaHouseBrewersメーリングリストで公開していたものに、安藤友晴<tomoharu@wakhok.ac.jp>がいくつかのメソッドを加え、また既存のメソッドにもいくつかの変更を施しました。

このクラスライブラリの公開を許可していただいた田村健人氏に感謝します。


2. CSVとは?

CSV(Comma Separated Value) は、表計算ソフトやデータベースソフトなどで利用されているフォーマットです。ただのテキストファイルなので、汎用性に優れており、数多くのソフトでサポートされています。 構造は単純で、それぞれの項目がカンマで区切られているだけです。

たとえばあなたが表計算ソフトで、次のような表を作っていたとします。

年度 | 数量 | 価格
1995     15    200
1996     12    120
1997     19    240
これをCSV形式で保存すると、そのファイルの内容は、次のようになっているでしょう。それぞれの項目がカンマで区切られているのがわかりますね。
----- 保存された内容 -----
年度,数量,価格
1995,15,200
1996,12,120
1997,19,240
--------------------------
項目そのものにカンマが含まれている場合は、項目全体を"で囲って出力します。このことを「エンクォートする」と言います。例えば、
a,b
をCSV形式にすると、
"a,b"
となります。

また、項目そのものに " が含まれている場合も、エンクォートされます。 その場合、項目中の " は、""に置き換えられます。

... 実は、CSV形式のフォーマットの定義には、あいまいな部分が多いのです。 文書化されたCSV形式の定義は、Wotsit's Formatでしか見たことがありません。しかも、前述の私の説明と少し違う部分があります。でも、現在のソフトウェア(例えば、Microsoft Excelなど)では、前述の私の説明のとうりに動作します。実用上は、それで困ることはないはずです。

CSVの定義について、何か情報をお持ちの方は、ぜひまでお知らせください。


3. 構成内容

配布用ファイルcsv.zip (または csv.tar.gz)には、次のファイルが含まれています。

README.html
このファイルです。
csv.jar
jarファイル。コンパイル済みのクラスファイルが含まれています。
src/
ソースファイルが含まれています。
doc/
javadoc で生成した APIドキュメントが含まれています。
examples/
使用例が含まれています。


4. クラスの概要

csv.jarには、jp.ac.wakhok.tomoharu.csvパッケージが含まれています。 このパッケージには、2つのpublicなクラスが含まれています。

jp.ac.wakhok.tomoharu.csv.CSVTokenizer
既にある1行のCSV形式のデータを解析し、それぞれの項目に分解するクラス。CSV形式に対応した java.util.StringTokenizer のようなもの。
jp.ac.wakhok.tomoharu.csv.CSVLine
CSV形式の1行分のデータ内容を保持するクラス。CSV形式への書き出し、書き出しの際のエンクォートの指定、項目の追加などが可能である。

大雑把に言えば、CSVTokenizer はCSV形式のデータを解析するためのクラスであり、CSVLineはCSV形式のデータを書き出すためのクラスです。


5. 必要な環境

必要なものはJDKだけです。JDK1.1 以上に対応しています。
インナークラスを利用しているため、JDK1.0.2では動作しません。動作させるためにはインナークラスを通常のクラスに書き換える必要があります。


6. インストール

配布ファイル(csv.zip または csv.tar.gz)に含まれている csv.jar を、クラスパスに追加してください。


7. 使用例1: 1行のCSV形式のデータを解析し、それぞれの項目を出力する。

まずはじめは、1行のcsv形式のデータを分解して、それぞれの項目を出力する例です。改行記号は取り除いておいてくださいね。

 1: import jp.ac.wakhok.tomoharu.csv.CSVTokenizer;
 2: 
 3: public class Test1 {
 4: 	public static void main(String args[]) {
 5: 		CSVTokenizer csvt = new CSVTokenizer("a,b,c");
 6: 		while (csvt.hasMoreTokens()) {
 7: 			System.out.println(csvt.nextToken());
 8: 		}
 9: 	}
10: }

---(出力例)---
a
b
c
--------------

java.util.StringTokenizer の使い方に似ています。
また、CSVTokenizer は、java.util.Enumerationクラスを実装しています。 そのため、java.util.StringTokenizerクラスのような取り扱いも可能です。


8. 使用例2: エンクォートされた文字列を解析する。

次の例では、
"a",b""c,d
のようにエンクォートされた文字列を解析します。

 1: import jp.ac.wakhok.tomoharu.csv.CSVTokenizer;
 2: 
 3: public class Test2 {
 4: 	public static void main(String args[]) {
 5: 		CSVTokenizer csvt = new CSVTokenizer("\"a\",b\"\"c,d");
 6: 		while (csvt.hasMoreTokens()) {
 7: 			System.out.println(csvt.nextToken());
 8: 		}
 9: 	}
10: }

---(出力例)---
a
b"c
d
--------------

エンクォートされた文字は、エンクォートを取り去ってから出力されます。 また、"" は、 " に置き換えられます。


9. 使用例3: データを集め、CSV形式にして書き出す。

項目を追加したり、変更したりするときは、CSVLineを使います。

 1: import jp.ac.wakhok.tomoharu.csv.CSVLine;
 2: import jp.ac.wakhok.tomoharu.csv.CSVTokenizer;
 3: 
 4: public class Test3 {
 5: 	public static void main(String args[]) {
 6: 		CSVLine csvline = new CSVLine();
 7: 		csvline.addItem("a");
 8: 		csvline.addItem("b,c");
 9: 		csvline.addItem("0123", true);
10: 		csvline.addItem("d");
11: 		csvline.addItem(new CSVTokenizer("e,f"));
12: 		String line = csvline.getLine();
13: 		System.out.println(line);
14: 	}
15: }

-------(出力例)-------
a,"b,c","0123",d,e,f
----------------------

このコードでは、6行目でCSVLineのインスタンスを生成し、7〜11行目でインスタンスに項目を追加し、12行目で1行分のCSVデータを取り出しています。

7行目と10行目では、引数で指定した文字列を加えています。

8行目と9行目は、データの出力時にエンクォートさせる例です。
8行目では、文字列の中にカンマが含まれているため、自動的に"でエンクォートされています。
9行目では、"0123" という文字を、強制的にエンクォートさせています。
CSVLine#additem(String, boolean) では、第2引数のbooleanの値によって、強制的にエンクォートするかどうかを設定できます。9行目では、第2引数は"true"であり、強制的にエンクォートすることを示します。

なぜこのような機能が必要なのでしょうか?本来エンクォートは、,や"などのメタキャラクタを正しく扱うためのものです。その他に、ExcelやAccessのようなアプリケーションでは、その項目が文字列であることを明示的にするためにも使われます。これは慣習的なものと思われますが、便利です。

11行目では、CSVTokenizerのインスタンスを引数とし、既にあるcsv形式のデータ"e,f"を分解し、それぞれの項目を CSVLine のインスタンスに追加しています。

12行目では、csv形式のデータを取り出します。データは、項目を追加した順に並んでいます。


10. このライブラリに関する情報源

このクラスライブラリのバグ、最新版の情報などについては http://www.wakhok.ac.jp/~tomoharu/Java/csv/にあります。
また、ソフトウェアに関するご感想、ご意見、ご要望などを 安藤友晴<tomoharu@wakhok.ac.jp>までお送りください。


11. 更新履歴

Version 1.0.1 (1999.4.14)

CSVTokenizer
CSVLine

Version 1.0 (1999.2.23) -- 田村健人氏の原作からの変更点

CSVTokenizer
CSVLine


12. 今後の計画について

現在のバージョンは Version 1.0.1 です。
今後は、以下のような拡張を考えています。


13. 終わりに

このソフトウェアに関するご感想、ご意見、ご要望などを 安藤友晴<tomoharu@wakhok.ac.jp>までお送りください。
それでは、Happy Hacking!


Last modified: Apr 14, 1999
e-mail: tomoharu@wakhok.ac.jp