5分でできる!簡単なcsvデータの加工(read/write)法。(Java編)
仕事やプライベートで?受け取ったcsvのデータを、自分の思うようにちょっと加工したいときってありませんか?
項目の順番を入れ替えたり、文字列に加工したりして、自分の使いやすい形に整形したいというシーンは結構あると思います。
Script系の言語を使ったり、SedやAwkを使う!という人もいるでしょうね。私はjavaが使い慣れているので、今回はJavaを使ってみたいと思います。
いくつか便利なライブラリがあるようですが、私は、opencsvが使いやすいと思いました。
opencsvでは、csvファイルの読み込みの方法をいくつか指定することができます。
どの方法を利用して読み込みを行うかはMappingStrategyクラスを切り替えることで指定できます。
HeaderColumnNameTranslateMappingStrategy
HeaderColumnNameMappingStrategy
などはヘッダ項目をもつcsvファイルを扱うのに便利なクラスのようですね。私が今回利用したのはColumnPositionMappingStrategyクラスです。
csvファイルを簡単に加工するというのが目的ですので、読み込み/書き込みの記述が比較的シンプルな方法を選択しました。
準備作業
参照するjar(ライブラリ)
コンパイルに必要なライブラリは以下の通りです。OpenCVはもちろん必要ですが、「commons-beanutils」と「org.apache.commons」も必要なので、詳細は、ここのdependenciesを確認しましょう。
※2016/09/01に再検証した時点では、以下のjarが必要でした。
- opencsv-3.8.jar
- commons-beanutils-1.9.2.jar
- commons-lang3-3.4.jar
読み込みに使うcsvファイル
実際に読み書きに使用するcsvファイルを適当なディレクトリに用意します。サンプルとして、「SampleIn.csv」というファイルをUTF-8の文字コードで作成しました。
key,name,pref,job key1,name1,pref1,job1 key2,名前2,県2,お仕事2
上記のような内容のcsvで良いと思います。1行目がヘッダで、このヘッダ名をキーに下記の「String[]{“key”, “name”, “pref”, “job”}」で対応付けて読み取ります。
csvを扱うクラスの作成
まず、読み込み対象のcsvファイルの項目に対応する単純なJavaBeansクラスを定義します。項目さえ定義すれば、SetterとGetterはEclipseなどのIDEが自動で吐いてくれますよね。
コンストラクタで空白をセットしておいてあげると、空行とかを読み込んだときにエラーで落ちることを防いでくれます。
SampleCsvBeanクラス
package jp.koji.bean; public class SampleCsvBean { String key; String name; String pref; String job; public SampleCsvBean() { this.key = ""; this.name = ""; this.pref = ""; this.job = ""; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPref() { return pref; } public void setPref(String pref) { this.pref = pref; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } }
次に、作成したJavaBeansクラスを読み書きする、Mainクラスを作成します。
MainCSVUtil
package jp.koji.bean; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.OutputStreamWriter; import java.io.InputStreamReader; import java.io.Reader; import java.io.Writer; import java.util.Iterator; import java.util.List; import com.opencsv.CSVReader; import com.opencsv.CSVWriter; import com.opencsv.bean.ColumnPositionMappingStrategy; import com.opencsv.bean.CsvToBean; public class MainCSVUtil { public static void main(String[] arg) throws Exception { writeSampleCSV("D:\\SampleOut.csv",readSampleCSV("D:\\SampleIn.csv")); } public static List readSampleCSV(String inputFilePath){ Reader ioreader = null; List tmpNDCsvBean = null; try { ioreader = new InputStreamReader(new FileInputStream(inputFilePath),"UTF-8"); ColumnPositionMappingStrategy mappingStrategy = new ColumnPositionMappingStrategy(); mappingStrategy.setType(SampleCsvBean.class); String[] columns = new String[]{"key", "name", "pref", "job"}; mappingStrategy.setColumnMapping(columns); CsvToBean csv = new CsvToBean(); CSVReader reader = new CSVReader(ioreader, ',', '"'); tmpNDCsvBean = csv.parse(mappingStrategy, reader); } catch (Exception e) { e.printStackTrace(); }finally{ try{ ioreader.close(); }catch(Exception e){ e.printStackTrace(); } } return tmpNDCsvBean; } public static void writeSampleCSV (String outputFilePath, List listCSVBean){ Writer iowriter = null; CSVWriter writer = null; try { iowriter = new OutputStreamWriter(new FileOutputStream(outputFilePath),"UTF-8"); writer = new CSVWriter(iowriter, ',', CSVWriter.NO_QUOTE_CHARACTER); Iteratorite = listCSVBean.iterator(); while(ite.hasNext()){ SampleCsvBean tt = ite.next(); String[] entries = new String[]{tt.getKey(), tt.getName(), tt.getPref(), tt.getJob().replace(",", "、") }; writer.writeNext(entries); } writer.close(); }catch (Exception e) { e.printStackTrace(); }finally{ try{ iowriter.close(); }catch(Exception e){ e.printStackTrace(); } } } }
一旦読み込むと、定義したJavaBeans型のリストとなるので、その後の加工は自由自在です。加工した結果を、csvに吐き出すコードは、上記の「writeSampleCSV」です。
一つ作っておくと、いろいろなcsvを加工するのも楽ですよ。
タグ:java