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データとして読み込める」ということになります。