ライブラリ
Github
Maven
<dependency>
<groupId>com.uchicom</groupId>
<artifactId>csve</artifactId>
<version>1.1.0</version>
</dependency>
Sample
var file = new File();
var charset = StandardCharsets.UTF_8;
var columnSize = 10; // csvのカラム数
var isForceSizeFix = false; // trueにすると、指定したcolumnSizeを無視して、カラムを増やす
try (var reader = new CSVReader(file, charset)) {
String[] record = null;
while ((record = getNextCsvLine(columnSize, boolean isForceSizeFix)) != null) {
// ここに一行ごとの処理を記載する.
}
}
JavaでCSVエディタを作った
Excel買うお金がないし、低スペックPCではLibreOfficeを使用するのは荷が重いという動機で、数年前にJavaのCSVエディタを作りました。すぐに情熱は冷めてしまって放置してしまったのですが。
CSVReaderを利用する
ただ、このリポジトリには銀行CSVを読み込むためのメソッドをCSVReaderに用意していたので、
CSVの読み込みに使えるということだけを記憶していました。
ちょうど最近の案件でCSVを読み込む内容があったので、1から作るよりも楽だという理由で、上記ライブラリのCSVReaderを使いました。
この案件の単体テストや結合テスト上問題はないのですが、結論から言うとバグがありました。
なぜCSVReaderにバグがあるとわかったのか
既存DBへの不満
同じころ、WEBサービスのデータベースで再起動後にデータが破損するという事態が発生し、
いまも、もやもやしながら、バージョンを落として使用しています。
私の作っているシステムでは、常時大量のアクセスがあるわけでもなく、
業務が発生したら、その都度利用されるようなもので、データ量もそこまで多くありません。
CSVDBの自作に挑戦
そのようなこともあり、CSVを利用した簡単なRDBを作ろうと思い立ちました。
最初は簡単なSQLを発行して、標準出力に結果行を吐き出すという機能を実装しました。
パフォーマンスを犠牲にすることは承知の上ですが、既存の検索ツールと比べて桁違いで遅いとモチベーションが下がります。
そこで、世の中のCSVをSQLで検索する機能と比較してみることにしました。
ChatGPTに性能のよいものを聞いたところ、DuckDBを提案してきたので、
DuckDBとのベンチマーク比較を行おうと、最初は3万行、次に5万行と試したところ、
5万行の比較の際にcsvdbの検索ツールでエラーが発生しました。
バグ修正
4Mバイトのキャッシュで処理を行っていたのだけど、
キャッシュの更新がうまくできていないため、4Mバイトのキャッシュを使い切るとエラーになるという状態でした。
客先にリリースしてしまったからには、バグを修正しなければなりません。
もはや他人のソースコードのようでしたが、バグ修正済みです。
ついでに、Java21化してます。