Java で CSVファイルの解析

CSVファイルを読んで何かする、という処理がけっこうあることがありますが、Java の StringTokenizer というクラスを使うと簡単にできることを発見しました。
(ただ、後で何かの FAQ かなにか見てたら載ってたのでもうかなり誰でも知っていることなのでしょうけど ...)

まず、StringTokenizer の使い方ですが、コンストラクタで読み込む文字列と区切り文字を指定する、というのが簡単かと思います。
下の例はそうしていますが、最初にファイルを FileReader として読み込み、それを BufferedReader で読み込みます。BufferedReader クラスは readLine メソッドを使用するために使用しています。そして、その readLine メソッドで改行文字までをファイルから読み込んで、カンマごとに区切った文字を取り出す、といった手順になります。

import java.io.*;
import java.util.*;

class StringTokenizerTest
{
public static void main(String args[]) throws Exception
{
FileReader filereader = new FileReader("book1.csv");
BufferedReader bufferedreader = new BufferedReader(filereader);

String line;
int i = 1;
int j = 0;
while((line = bufferedreader.readLine()) != null) {
System.out.println("Start line at " + i);
StringTokenizer stringTokenizerTest = new StringTokenizer(line, ",");
while(stringTokenizerTest.hasMoreTokens()) {
System.out.println(stringTokenizerTest.nextToken().toString()+ " at " +j + " of " + i);
j++;
}
i++;
}

filereader.close();
}
}

Excel などで作成した以下のようなファイルで実行すると以下のような結果になります。

book1.csv

こちらが実行結果です。

ちゃんと出力されているのがわかると思います。

ただし、StringTokenizer を使用した場合、Java のユーティリティをそのまま使えるのとコーディングが簡単なのがメリットなのですが CSV ファイルの内容によっては間違った結果が返ってしまう可能性があります。
例えば、データの中に , がある場合や、空白データがある場合は結果が間違ってしまいます。新しいデータでテストしてみましょう。

新しい book1.csv

3行目のデータが全然違ってますね。

このようなデータがありえる場合、" や , の出現にあわせてロジックを考えて新しいクラスを作成する必要があります。
インターネットをさがしてみると CSVTokenizer というものがありました。これなども使えるのではないかと思います。

この CSVTokenizer は StringTokenizer と使い方が一緒らしいので、上の StringTokenizerTest.java の該当部分をほぼいれかえただけのプログラムを作ってテストしてみました。

import java.io.*;
import java.util.*;
import jp.ac.wakhok.tomoharu.csv.CSVTokenizer;

class CSVTokenizerTest
{
public static void main(String args[]) throws Exception
{
FileReader filereader = new FileReader("book1.csv");
BufferedReader bufferedreader = new BufferedReader(filereader);

String line;
int i = 1;
int j = 0;
while((line = bufferedreader.readLine()) != null) {
System.out.println("Start line at " + i);
CSVTokenizer csvTokenizerTest = new CSVTokenizer(line);
while(csvTokenizerTest.hasMoreTokens()) {
System.out.println(csvTokenizerTest.nextToken().toString()+ " at " + j + " of " + i);
j++;
}
i++;
}

filereader.close();
}
}

これが上のプログラムの実行結果ですけど、ちゃんと正しい結果が出てますね。

Java のユーティリティをそのまま使えるかわり CSV データの中に空白データや , を含んだデータがないように制限する、という選択肢と、上に挙げた CSVTokenizer のようなものを使用する/作成するという選択肢があることになりますね。
どちらを使うかは状況によって選べばいいでしょう。

[Top Pageに戻る]

Ads by TOK2