CSVファイルをJSON形式に変換するOne-Liner | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

を、awkで。

例えば、こういう店舗情報が書かれたCSVがあって、


001,○×店,東京都杉並区XXXXXX
002,△△カフェ,東京都千代田区XXXXX
003,□□店,神奈川県横浜市XXXXXXXXXXXXX
004,×××,千葉県千葉市XXXX


これを、JSON形式のファイルへ変換したいとする。



awkワンライナーでCSVファイルをJSON形式に変換する


書き方は、こんな感じ。


$ awk 'BEGIN {FS=","; json = "[";} {json = json "{\"code\":\"" $1 "\",\"shop\":\"" $2 "\",\"address\":\"" $3 "\"},\n";} END {sub(/,\n$/, "", json); json = json "]\n"; print json}' data.csv


簡単に解説すると、「FS=","」にて、CSV形式のファイルを読み込むようにし、BEGINブロックでjson変数に初めの"["を格納。

後は、ファイルの各行を読みながらそれぞれのキーとデータをjson変数に取り込んでいく。

最後にENDブロックのsub()にて、余剰なカンマを取り除く処理をして出力ってな感じです。


本当は、最後の行の処理であればカンマをつけないという処理をしたいのですが、awkではファイルの行数を最初から読み込むことができない模様。

(一度、ブロック内でループさせてやれば可能だが余計な処理となるため、少し力技)


出力結果はこんな感じ。


[{"code":"001","shop":"○×店","address":"東京都杉並区XXXXXX"},
{"code":"002","shop":"△△カフェ","address":"東京都千代田区XXXXX"},
{"code":"003","shop":"□□店","address":"神奈川県横浜市XXXXXXXXXXXXX"},
{"code":"004","shop":"×××","address":"千葉県千葉市XXXX"}]

余計なタブとか改行を入れていないので見難いですが、CSV形式のファイルからJSON形式に一発変換することができます。

FireFoxアドオンのJSONView で見てみると



A Day In The Boy's Life-JSONView


ただ、データが全て文字型として出力している(""で括っている)ので、数値型で出力したい場合は該当箇所を適宜変更してください。

あと、CSVファイルがUnicode以外であった場合は、処理前か後かでコンバートしておく必要もあります。