CSVParserは、CSVファイルを読み込むためのJavaライブラリです。値にデリミタ(通常はカンマ)や改行がある場合にも対応しています。
現在、正式版をリリースしています。 ソースおよびバイナリは次のリンクからダウンロードできます。
CSVファイルは、値をデリミタで区切り、レコードを改行で区切ったテキストファイルです。 基本的なルールは次のとおりです。
BasicCSVUtilityクラスを使うと簡単にCSVファイルを読み込むことができます。 状況に応じて、すべてのレコードを一括で読み込むことも、レコードを一行ずつ読み込むこともできます。
一括で読み込むには次のようにします。
public static void main(String[] args) throws IOException {
CSVUtility utility = new BasicCSVUtility();
String[][] records = null;
Reader reader = new BufferedReader(new FileReader(args[0]));
try {
records = utility.parse(reader);
} finally {
reader.close();
}
/* handle records */
}
一行ずつ読み込むには次のようにします。
public static void main(String[] args) throws IOException {
CSVUtility utility = new BasicCSVUtility();
CSVReader reader = utility.createCSVReader(
new BufferedReader(new FileReader(args[0])));
try {
String[] record = null;
while ((record = reader.readRecord()) != null) {
/* handle record */
}
} finally {
reader.close();
}
}
デリミタをカンマではなくタブにするにはBasicCSVUtilityを生成している箇所を次のようにします。
CSVUtility utility = new BasicCSVUtility(new BasicCSVParser('\t'));
CSVファイルの解析例を示します。
| Input | Output | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
1,One,First 2,Two,Second 3,Three,Th"i"rd |
| |||||||||
1,"One,First" 2,"Two,Second 3,Three,Th""i""rd" |
|
BasicCSVParserがCSVデータを解析するアルゴリズムは、 次の状態遷移表を実現するオートマトンとなります。。
| Current State | Input | Next State |
|---|---|---|
| NEW_RECORD | delimiter | DELIMITED |
| quotationMark | QUOTED | |
| newLine | NEW_RECORD | |
| otherCharacter | VALUE | |
| VALUE | delimiter | DELIMITED |
| quotationMark | VALUE | |
| newLine | NEW_RECORD | |
| otherCharacter | VALUE | |
| DELIMITED | delimiter | DELIMITED |
| quotationMark | QUOTED | |
| newLine | NEW_RECORD | |
| otherCharacter | VALUE | |
| QUOTED | delimiter | QUOTED |
| quotationMark | ESCAPED | |
| newLine | QUOTED | |
| otherCharacter | QUOTED | |
| ESCAPED | delimiter | DELIMITED |
| quotationMark | QUOTED | |
| newLine | NEW_RECORD | |
| otherCharacter | VALUE |
開始状態はNEW_RECORDです。 終了状態は任意の状態となります。 すべての入力について遷移があり、すべての状態が終了状態になるということから、 理論的には「すべてのテキストデータをCSVデータとして読み込める」ということになります。