atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

CSVパーサを実装中

今日は、.NETでCSVパーサを実装していた。.NETでCSVを手軽に扱いたいのであれば、TextFieldParserクラスというクラスがあるのだが、このクラスはMicrosoft.VisualBasic.FileIO名前空間に属するということで、使用するのは何となく気が引ける*1
実装といっても一からではなく、以前ASPの開発をした際に実装したVBScript版、C++Builderで使うためにVBScript版から移植したC++*2の資産があったので、それを.NET向けに移植することにした。移植するだけなら極めて短時間で終わりそうなものだが、私の性格上どうしてもそれができない。自分が書いたコードを書き直す際には、よほど時間に追われていれば別だが、そうでない限り改善を試みようとしてしまう。他人の書いたコードであれば、できるだけ当たらず触らずを目指すのだが。
VBScript版とC++版は、(恥ずかしながら)Excelで出力したCSVから仕様を予想しつつ実装していた。今回は、RFC 4180日本語訳)を読みながら、それに準拠した形で実装しようとしている。
さらに、フォーマットチェックの厳密度をオプション指定できるようにし、厳密度を下げることで解析処理の速度を向上させられるようにしたいと考えている。なぜなら、CSVファイルの入出力はアプリケーションが行うのが普通で、人の手によってテキストベースで編集されたCSVファイルを扱うことは稀なため、パーサが解析するCSVファイルのフォーマットが不正でないことが保証されている場合が多いからだ*3
しかし、CSVパーサなど今ままでにどれだけのプログラマが実装してきたことだろう。インターネットで検索すると、多くの実装を見つけることができる。しかし、逆にそれが災いし、いざそのうちのいずれかを利用するとなると、どれを選んだものか、そもそも何を基準に選べば良いのか、と考えなければならないことが多い。決定版と言われるようなものが公開されていれば、迷わずそれを利用できる。例えば、ログ出力でのlog4netや、JavaScriptでのYAHOO! UI Library*4といった具合だ。CSVパーサにはそれがないように思える。なので、ライブラリの比較、機能評価に何時間も費やすくらいなら、自分で実装してしまえ、という心境になる。

*1:というかプライドが許さない

*2:VCL使用

*3:セキュリティの観点から、厳密なフォーマットチェックを行うモードでの動作は実装しなくてはならないと思う

*4:JavaScriptライブラリは百花繚乱なので、個人の好みによるが