JavaでCSV・TSV形式のデータをパースする方法

java

CSV・TSVデータのパースするJavaライブラリ「opencsv」の使い方を紹介します。

[スポンサーリンク]

CSV・TSVデータを自前でパースしているシステムをたまに見かけます。(TдT)
CSV・TSVデータは、カンマを文字列で扱うこともありますので、単純にカンマ区切りでパースするとバグを生み出します。

この章でやること

「opencsv」を使って、CSV・TSV形式のデータをパースする方法を紹介します。

opencsvライブラリの取得

Mavenを使っている場合は、こちらをpom.xmlに追記します。

	<dependency>
		<groupId>net.sf.opencsv</groupId>
		<artifactId>opencsv</artifactId>
		<version>2.3</version>
	</dependency>

CSVデータをパースするプログラム

    public static void main(String[] args) throws IOException {
    	// カンマ区切りのライン
    	String line1 = "test1,test2,test3";
    	
    	// カンマ区切りのラインをパースします。
    	CSVParser csvParser = new CSVParser();
    	String[] csvLine1 = csvParser.parseLine(line1);
    	for (String line : csvLine1) {
    		System.out.println(line);
    	}
    }

実行結果

>実行結果
test1
test2
test3

解説

6行目で、CSVParser をインスタンス化しています。
引数無しの場合は、カンマを区切り文字(CSV形式)としてパースします。

カンマを文字列として扱っているCSVデータをパースするプログラム

    public static void main(String[] args) throws IOException {
    	// カンマを文字列として扱っているライン
    	String line1 = "test1,\"test2,test2\",test3";
    	
    	// パースします。
    	CSVParser csvParser = new CSVParser();
    	String[] csvLine1 = csvParser.parseLine(line1);
    	for (String line : csvLine1) {
    		System.out.println(line);
    	}
    }

実行結果

>実行結果
test1
test2,test2
test3

解説

CSVの仕様として、カンマを文字列で扱う場合は、ダブルクォートで囲います。
「opencsv」を使えば、ダブルクォートを特に意識することなく、パースすることができます。

TSVデータをパースするプログラム

    public static void main(String[] args) throws IOException {
    	// タブ区切りのライン
    	String line1 = "test1\ttest2\ttest3";
    	
    	// タブ区切りのラインをパースします。
    	CSVParser csvParser = new CSVParser('\t');
    	String[] csvLine1 = csvParser.parseLine(line1);
    	for (String line : csvLine1) {
    		System.out.println(line);
    	}
    }

実行結果

>実行結果
test1
test2
test3

解説

タブ区切りのデータ(TSV)をパースする場合は、CSVParser をインスタンス化する時に、区切り文字(タブ)を指定します。
'\t' は正規表現でタブを表しています。

最後に

CSV・TSV形式のデータは意外と奥が深いです。
改行やダブルクォート・シングルクォート・カンマを考慮する必要があります。
「opencsv」は、これらの特殊記号をキチンと考慮してくれているので、opencsvを使うことで開発が楽になります。
積極的にライブラリを使っていきましょう!
それでは!