Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

opencsvで区切り文字を指定して読み込み

こんにちは、かささぎです。絶賛ニート中です。

今回はjavaでopencsvを用いてCSVファイルを読み込む話をしていきます。

CSVファイルとは

カンマ区切りとも呼ばれる、カンマで値を区切ったデータファイルです。

opencsvとは

CSVファイルをパースしてくれるJavaライブラリです。

CSVファイルはデータ形式が単純なので、ライブラリが無くても解析はできますが、使ったほうが楽です。

基本的な読み込み

こんな感じです。

try{

    FileReader fileReader = new FileReader(new File("hoge.csv") );
    CSVReader reader = new CSVReader(fileReader);

    List<String []> datas = reader.readAll();

}catch(Exception e){

    e.printStackTrace();
}

これを実行すると、datasにlistとして一行ずつデータが格納されていきます。

区切り文字等の設定

CSVは基本的にカンマ区切りですが、スペースやタブなど、他の文字で区切りたいこともあると思います。

その際にはCSVReaderの第二引数に区切り文字を設定して...と思ったのですが、
Intellijさんに横棒を付けられました。

実行してみると推奨されなくなったみたいです。

ggると、
f:id:yh9092:20180803112002p:plain
http://opencsv.sourceforge.net/apidocs/com/opencsv/CSVReader.html

代わりにCSVReaderBuilderを使えって書いてありました。

これをもとにソースを苦しみながら解読して実装しました。

区切り文字をスペースにする例は以下のようになります。

try{

    FileReader fileReader = new FileReader(new File("hoge.csv") );
    
    CSVPerser parser = new CSVParserBuilder().withSeparator(' ').build();
    CSVReader reader = new CSVReaderBuilder(fileReader).withCSVPerser(parser).build();

    List<String []> datas = reader.readAll();

}catch(Exception e){

    e.printStackTrace();
}

解説します。

CSVReaderBuilder().build() と CSVReader() は同じものを表すようです。


withCSVParser() でparserの設定を加えることができるようです。

parserもreader同様、Builder().build()にする必要があります。


withSeparator(char) でセパレータ(区切り文字)を設定できます。

この前後に.でつなぐことで、他にもいろいろな設定ができるみたいです。


例えば、withQuoteChar(char)で引用符の文字を設定したり、
withIgnoreQuotations(true)で引用符を無視する設定にできたりします。

他にもReaderで先頭n行をとばす設定ができたりと、いろいろ用意されているので、
是非調べてみてください。


それでは。