CSVを整形してDynamoDBにインポートできるようにするPythonスクリプト
{"属性名":{"型":"値"},"属性名":{"型":"値"}…}
{"id":{"n":"1"},"name":{"s":"dog"},"method":{"m":{"cry":{"s":"bowwow"},"runnable":{"bOOL":true}}}}
{"id":{"n":"2"},"name":{"s":"cat"},"method":{"m":{"cry":{"s":"meow"},"runnable":{"bOOL":false}}}}
手作業でこのフォーマットのデータを用意するのはしんどいので、CSVデータをこのフォーマットのJSONに変換するPythonスクリプトを作ってみました。データのインポートのやり方は↓の記事で紹介しています。
ソースコード
実際のスクリプトがこちら。import json
import csv
import codecs
json_list = []
csv_path = input("CSVのパスを入力:")
# CSVファイルを配列として読み込む
at_first = True
is_map = False
with open(csv_path, 'r') as in_file:
# 配列の組み換え
for line in csv.DictReader(in_file):
if at_first : # 一行目ならキー名と属性の情報を保存
key_list = line.keys()
Attribute_list = line
at_first = False
else :
# レコード単位に項目名、型、値に要素を分解しディクショナリにセットする
buf_dict = {}
for key in key_list :
# MAP型の情報保存
if Attribute_list[key] == 'm' :
is_map = True
map_key = key
buf_dict[map_key] = {}
buf_dict[map_key]['m'] = {}
continue
if not line[key] :
continue
attribute_dict = {}
attribute_dict[Attribute_list[key]] = line[key]
if not is_map :
buf_dict[key] = attribute_dict
else : # MAP型なら以降のデータを階層下げてセットする
buf_map_dict = {}
buf_map_dict[Attribute_list[key]] = line[key]
buf_dict[map_key]['m'][key] = buf_map_dict
json_list.append(buf_dict)
is_map = False
with codecs.open(csv_path.replace('.csv','.json'), 'w', 'utf-8') as out_file:
# JSONへ1行ずつ書き込み
for json_row in json_list :
out_file.write(json.dumps(json_row, ensure_ascii=False) + '\n')
MAP型にも1階層までですが最終の項目なら対応しています。
ホントは再帰とlambdaとか使ってどこまでも深くできればエレガントなんですが…。
使い方
コマンドプロンプトで実行してみます。>type animals.csv
id,name,method,cry,runnable
n,s,m,s,bOOL
1,dog,,bowwow,true
2,cat,,meow,false
>python csv2json.py
CSVのパスを入力:animals.csv
>type animals.json
{"id": {"n": "1"}, "name": {"s": "dog"}, "method": {"m": {"cry": {"s": "bowwow"}, "runnable": {"bOOL": "true"}}}}
{"id": {"n": "2"}, "name": {"s": "cat"}, "method": {"m": {"cry": {"s": "meow"}, "runnable": {"bOOL": "false"}}}}
CSVが変換されてData Pipelineで取り込める形式のJSONになりました。理由がよくわかりませんがBOOL型は「bOOL」と書かないとData Pipelineがコケます。
Python最近使い始めましたが、Windows環境でちょいスクリプト書くなら今のところ一番楽に使えますね。
これまではBATやVBSばかり使っていましたが、ストアアプリ版なら導入簡単だし。
でわ。
ディスカッション
コメント一覧
まだ、コメントがありません