Embulk の CSV Parser で、TSV のファイルを読み込んでいたとき、InvalidValueException が発生して、処理が止まってしまった。調べてみると、次のようなデータの場合に失敗することが分かった。
カラム1 | カラム2 | カラム3 |
---|---|---|
abc | "de"f | ghi |
この例の場合、カラム2の「"de"f」で Exception が発生する。
これは「"」で始まったカラムは「"」で終わることが期待されており、その後ろに続く文字は、区切り文字(delimiter)もしくは改行(newline)が期待されているため。「"」のすぐ後に区切りでも改行でもない文字があるので、フォーマットが違うだろ!!という指摘の Exception だった。
TSV なので、カラムのクォートは関係ないかなと思っていたのだけど、CSV Parser のデフォルトが quote: "\t" となっているので、そういう動作になっていた。
quote: ""
とすれば無視されるかな?と思ってやってみたけど、変わらず。じゃあ、どうするかな?元のデータを加工した方がいいのかな?とか思いつつ、Twitter に悩みを吐露したら @frsyuki さんからアドバイスを頂いた!
@suzuki quote: オプションに ‘“‘ を指定するのではなく、例えば “\v” とか、出現しえない文字を指定したら、クオート処理がすべて無効化され、結果として回避できませんか?
— FURUHASHI Sadayuki (@frsyuki) 2015, 8月 5
アドバイスどおりに quote: "\v"
とすることで、この Exception は回避できた。
その後、quote: null
という指定ができるような拡張を進めて頂ける話になり、この日記を書いている 8/6 の朝時点では、もうこの件に対応する pull request が作成され、master ブランチに取り込まれていた!!
だからもうみんなは Embulk の最新版を使えば quote: null
という魔法のことばでこの問題を回避できるよ!!!
今回は(オレのレベルの低さで)コードによる貢献ができなかったのが残念だったけど、こういうアウトプットをしていくことだって OSS への貢献なんだ!という雑な自信を持って、この日記を書いている次第である。
できることをやろう。
【追記】
この修正が入った Embulk v0.6.21 がリリースされた! スピード感すごい!
Embulk v0.6.21リリース。@suzuki さんから報告された、” が値の途中に入ったCSV/TSVファイルをguess&パースできるようになりました。また、“rename” フィルタプラグインを追加しました。リリースノート:http://t.co/yfqTlZlPjv
— FURUHASHI Sadayuki (@frsyuki) 2015, 8月 5