ラズベリーパイを使ってみる – awkでテキストファイルをJSONに変換してみる –

スポンサーリンク

コンテンツ

変換元のテキスト

テキストファイル、カンマ区切りcsv。data.csvという名前で保存

20130207,06,12,ほげほげー1
20130207,09,13.25,ほげほげー2
20130207,12,15,ほげほげー3

変換先のテキスト

JSON、こんな感じで出てほしい

実行

awk -f hogehoge.awk data.csv

こんな感じのソースになった

hogehoge.awk

#!/usr/bin/awk

BEGIN	{
## Init
A1="date";A2="temp";A3="message";

## get line number
	cmd = "cat indata.csv |wc -l"
	cmd | getline t
	close(cmd)

FS=",";
printf("[");
}

{ # START MAIN loop
if(NR == t) { # データ終了行.カンマを付けない
	printf("{")
	printf(""%s": %s,"%s": %s,"%s": "%s"",A1,$1,A2,$2,A3,$3);
	printf("}")
}
else{ # 1こめ〜データ終了の1個前まで.カンマをつける
	printf("{")
	printf(""%s": %s,"%s": %s,"%s": "%s"",A1,$1,A2,$2,A3,$3);
	printf("},")
}

} # END MAIN loop

END {
printf("]};n");
}

が…

フィールド数3つと思ってたら4つだった/(^o^)\

ここらへん

printf(""%s": %s,"%s": %s,"%s": "%s"",A1,$1,A2,$2,A3,$3);

変えれば出来るんですが、どうもawkさんはprintfの中を'(シングルクオート)でかこむとエラー出すのでダブルクオート出すときはエスケープして出すしかないっぽいです(´・ω・`) エスケープが多いのは打ちにくいし見づらいので苦手、sedもこれが嫌だったりする。
sedの場合はデリミタを%などに変更可能なのでいいですが、awkはそういう言語では無いので変更できないみたい。

まあ元々

awkはテキスト→json変換用言語でも無いので^^; どちらかというとsedの領域な気がするけど、awkにBEGIN,ENDがあるから以外とjson変換もこなすawk。けっこう器用なawkさんであった。おわり。