CSVやタブ区切りテキストをJSONに変換しようとすると、意外にスマートな方法が見当たらなかったので、タブ区切りテキストをJSONに変換するawkスクリプトを書いてみた。jqを使って工夫する例もあったけど、シンプルなデータをJSONに変換したいだけならこれで事足ります。
たとえば次のように先頭行にカラム名が入っているタブ区切りのデータがあったとして、
% cat test.txt id name 1 foo 2 bar 3 bang
こんなふうに実行するだけで JSON になります。
% cat test.txt | ./tsv2json.awk
[
{
"id": "1",
"name": "foo"
},
{
"id": "2",
"name": "bar"
},
{
"id": "3",
"name": "bang"
}
]
出力結果は jq でパースできることを確認済みなので、フォーマットは多分問題ないはず。
コードは、わりとやっつけ仕事な感じで書いたので、いけてない部分は残っていると思います。
#!/usr/bin/awk -f BEGIN { FS="\t" } NR == 1 { for ( field = 1 ; field <= NF ; field++ ) { fieldname[field] = $field } next } { for ( field = 1 ; field <= NF ; field++ ) { data[NR, field]=$field } } END { print "[" for ( record = 2 ; record <= NR ; record++ ) { print " {" for ( field = 1 ; field < NF ; field++ ) { printf " \"%s\": \"%s\",\n", fieldname[field], data[record, field] } printf " \"%s\": \"%s\"\n", fieldname[NF], data[record, NF] if ( record != NR ) { print " }," } else { print " }" } } print "]" }