LoginSignup
6
3

More than 3 years have passed since last update.

jqコマンドで改行の入ったjsonファイルをCSVに変換する

Last updated at Posted at 2019-08-20

状況

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
6
3
5

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
6
3