Help us understand the problem. What is going on with this article?

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

状況

APIを叩くとjson形式でデータを返してくる社内DBから取得した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
henatyokotraveler
運用エンジニア。OSSのツールを色々試して仕事を楽にしたい。 AWS資格の制覇と、GCP、Kubernetesにチャレンジ中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした