CSVファイルをJSONファイルに変換するshellスクリプトです。
概要
csvとjsonの大きな違いは、csvは配列的なカラム情報に対して、jsonは連想配列的なカラム構造になる点だろう。
csvファイルのまま、レコード内でのカラムを配列にしてもいいのだが、それだとjson構造にする必要があまりないので、自動でkey値を付与する仕様とする。
また、key値は、任意でセットできるようにすることで、利便性を増すようにしたいと思う。
プログラム
#!/bin/bash
#save-fileName
saveFile="$1.json"
##column
keys=(`echo $2 | tr -s ',' ' '`)
while read line
do
##shell
# value-convert
line=`echo $line | sed -e 's/\s/\ \;/g'`
line=`echo $line | sed -e "s/\'/\&\#39\;/g"`
line=`echo $line | sed -e 's/\"/\&\#34\;/g'`
# set:array
arr=(`echo $line | tr -s ',' ' '`)
json=""
for ((i=0;i< ${#arr[*]};i++))
do
#key-check
if [ -n "${keys[$i]}" ];then
key=${keys[$i]}
else
key="key-$i"
fi
#echo "${key}:${arr[$i]}"
#json-checl
if [ -n "${json}" ];then
json=$json",\"$key\":\"${arr[$i]}\""
else
json="\"$key\":\"${arr[$i]}\""
fi
done
#print
echo "{$json}" >> ${saveFile}
done< $1
使い方
# 元ファイル「hoge.csv」
0,001,abcdefg,test1
0,002,hijklmn,test2
0,003,opqrstu,test3
# 処理実行
$ bash csv2json.sh hoge.csv flg,id,name,value,memo
# 出力 「hoge.csv.json」
{"flg":"0","id":"001","name":"abcdefg","value":"test1"}
{"flg":"0","id":"002","name":"hijklmn","value":"test2"}
{"flg":"0","id":"003","name":"opqrstu","value":"test3"}
注意点
配列を使っているため、shではなくbashで対応してます。
起動コマンドで間違えないようにしましょう。
あと、今回使用できるCSVのの形式は、項目ないの改行や、"(クォーテーション)の対応をしていません。
あくまで「,(カンマ)」で区切られたレコードを分割するという事を前提にしています。
0 件のコメント:
コメントを投稿