0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaでCSVを読み込むライブラリ

Last updated at Posted at 2025-05-23

ライブラリ

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化してます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?