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に戻る]

[PR] | 貴金属 買取ハウスクリーニング韓国食材インプラント転職サイトSEOアクセス解析ハウスメーカーレンタルオフィスSEO対策消費者金融不動産担保ローン時計車 買取ハワイ挙式アスクル転職生命保険テンプレート沖縄旅行動画免許合宿二輪引越し消費者金融税理士ゴルフ会員権留学レーシックマッサージFX投資信託くりっく365アフィリエイト育毛剤FXホームページ制作デイトレードFXタイバンコクハワイ レンタカーベスト ハワイ ホテル レーツバリ島年末年始ハワイHawaii hotelsHawaii Activitiesbhhrホノルルマラソン
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行
無料ホームページ作成 - レンタルサーバー - 携帯ホームページ - ブログ - ホテル 予約 - タイムシェア - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - ハワイ 不動産 - プーケット ホテル