業務でCSVの入出力と格闘中。
まあよくある頻出の作業だったりするんですが、自前でやるとなかなか面倒です。
面倒なポイントとしては
- クオートのエスケープ
- カンマのエスケープ
- ヘッダーとの結合
ですかね。
前職でもそうだったんですけど、こういう細かい作業を自前でやると上記のようなところで頻繁にバグが出ます。なので自力でやるのはできれば避けたいところ・・・
まあ一定のスキルを身につけるまでの最初のスキルアップの段階では無駄にはならないと思いますが。
社長に相談するとJavaで有名なライブラリ(Apache commons)があるということでさっそく探して使ってみることに。
探してみるとApache Commons CSVというライブラリがあり、歴史もあってなかなかよさげなのでこれを使ってみることにしました。
インストール
インストールは例によってmavenで行います。
いやー別のメンバーとも共有できますし、ほんと便利ですね・・・
もうなしでは作業できないかもです。
1 2 3 4 5 |
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.1</version> </dependency> |
使い方
InputStreamを引数にとり、そのあとは各種設定をして、parseするとList形式でデータが取れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
List<CSVRecord> recordList = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"))) { //Excel形式のデータを取得する CSVParser parse = CSVFormat.EXCEL //空行は無視(ただ値がないだけだと残ります。) .withIgnoreEmptyLines(true) //空白はトリミング .withIgnoreSurroundingSpaces(true) //ヘッダーをセット(ヘッダーは可変長引数です。) .withHeader(header) //ここでparse .parse(br); recordList = parse.getRecords(); br.close(); } catch (UnsupportedEncodingException ex) { Logger.getLogger(CSVDataGetter.class.getName()).log(Level.SEVERE, null, ex); } catch (FileNotFoundException ex) { Logger.getLogger(CSVDataGetter.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(CSVDataGetter.class.getName()).log(Level.SEVERE, null, ex); } finally { return recordList; } |
ちなみに参考にしたのは↓ここ
PerlのCPANやPHPのPearに近いかんじのようなので積極的にどんどんと組み込んでいこうと思います。