状況
jsonファイルをCSVに変換して、logstash経由でelasticsearchに取り込んでいる(そして、それをGrafanaで表示している環境)。
※CSV変換しないでjsonそのままで取り込めばいいとか、logstashなんで使うの?とかは自分の技術力の問題。
jsonでparceエラー出るし、bulkの形式に合わせるの手間だし、何も考えずにCSVぶっこみをしています。
CSV変換して取り込んでだいたいうまくいったんだけど、
改行を含んだデータがあって、はまったのでその対処のメモ。
jqコマンドでの一般的なCSV変換
cat sample1.json | jq -r '.[] | [.key1, .key2, .key3] | @csv'
参考:https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575
ところがこの場合、jsonの中に改行のあるデータがあると、
-rオプションでダブルコーテーションが外れて、改行コードのとこで改行されてしまう。
結果、CSVデータの改行がぐちゃぐちゃになって、elasticsearchのデータがおかしかったり、取り込めなかったりした。
改行と-r(--raw-output)オプション
改行を含んだjsonを改行させずにCSV化するにはどうしたよいか?
jqの@csvは、ググるとどのサイトも-rオプションが付いている。
でも、-rオプションをつけると、その時点でjsonのダブルコーテーションが外れて、改行されてしまう。
ということでsedコマンドで-rなしでCSVにできる形にし、@csvでCSV化することにした。
sed処理
こんな感じ。
実際は、-rつけてCSVにできたデータと、
-rなしを見比べながら、微調整した。
※なので、自分の環境特有の対処だと思うけど、方法論としては汎用的かなと。
cat sample1.json | jq '.[] | [.key1, .key2, .key3] | @csv' \
|sed 's/\\\\/\\/g' \ #各keyの値の中の\が\\になっていたので、元の\に戻す
|sed 's/\\\"/\"/g' \ #各keyの値が"ではなく\"で囲われていたので"に戻す
|sed 's/^"//g' \ #文頭についていたダブルコーテーションの削除
|sed 's/"$//g' \ #末尾についていたダブルコーテーションの削除
>> hoge.csv