安藤友晴<tomoharu@wakhok.ac.jp>
Version 1.0.1
1999.4.14
jp.ac.wakhok.tomoharu.csv パッケージは、CSV(Comma Separated Value)を扱うためのクラスライブラリです。もともと、田村健人氏がJavaHouseBrewersメーリングリストで公開していたものに、安藤友晴<tomoharu@wakhok.ac.jp>がいくつかのメソッドを加え、また既存のメソッドにもいくつかの変更を施しました。
このクラスライブラリの公開を許可していただいた田村健人氏に感謝します。
CSV(Comma Separated Value) は、表計算ソフトやデータベースソフトなどで利用されているフォーマットです。ただのテキストファイルなので、汎用性に優れており、数多くのソフトでサポートされています。 構造は単純で、それぞれの項目がカンマで区切られているだけです。
たとえばあなたが表計算ソフトで、次のような表を作っていたとします。
年度 | 数量 | 価格 1995 15 200 1996 12 120 1997 19 240これをCSV形式で保存すると、そのファイルの内容は、次のようになっているでしょう。それぞれの項目がカンマで区切られているのがわかりますね。
----- 保存された内容 ----- 年度,数量,価格 1995,15,200 1996,12,120 1997,19,240 --------------------------項目そのものにカンマが含まれている場合は、項目全体を"で囲って出力します。このことを「エンクォートする」と言います。例えば、
また、項目そのものに " が含まれている場合も、エンクォートされます。 その場合、項目中の " は、""に置き換えられます。
... 実は、CSV形式のフォーマットの定義には、あいまいな部分が多いのです。 文書化されたCSV形式の定義は、Wotsit's Formatでしか見たことがありません。しかも、前述の私の説明と少し違う部分があります。でも、現在のソフトウェア(例えば、Microsoft Excelなど)では、前述の私の説明のとうりに動作します。実用上は、それで困ることはないはずです。
CSVの定義について、何か情報をお持ちの方は、ぜひ私までお知らせください。
配布用ファイルcsv.zip (または csv.tar.gz)には、次のファイルが含まれています。
csv.jarには、jp.ac.wakhok.tomoharu.csvパッケージが含まれています。 このパッケージには、2つのpublicなクラスが含まれています。
大雑把に言えば、CSVTokenizer はCSV形式のデータを解析するためのクラスであり、CSVLineはCSV形式のデータを書き出すためのクラスです。
必要なものはJDKだけです。JDK1.1 以上に対応しています。
インナークラスを利用しているため、JDK1.0.2では動作しません。動作させるためにはインナークラスを通常のクラスに書き換える必要があります。
配布ファイル(csv.zip または csv.tar.gz)に含まれている csv.jar を、クラスパスに追加してください。
まずはじめは、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クラスのような取り扱いも可能です。
次の例では、
"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 --------------
エンクォートされた文字は、エンクォートを取り去ってから出力されます。 また、"" は、 " に置き換えられます。
項目を追加したり、変更したりするときは、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形式のデータを取り出します。データは、項目を追加した順に並んでいます。
このクラスライブラリのバグ、最新版の情報などについては
http://www.wakhok.ac.jp/~tomoharu/Java/csv/にあります。
また、ソフトウェアに関するご感想、ご意見、ご要望などを 安藤友晴<tomoharu@wakhok.ac.jp>までお送りください。
現在のバージョンは Version 1.0.1 です。
今後は、以下のような拡張を考えています。
このソフトウェアに関するご感想、ご意見、ご要望などを 安藤友晴<tomoharu@wakhok.ac.jp>までお送りください。
それでは、Happy Hacking!