CSVを整形してDynamoDBにインポートできるようにするPythonスクリプト

DynamoDBにData Pipeline経由でデータを取り込むには↓のようなフォーマットで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データをこのフォーマットの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')
やってることはCSVをの1行目を属性名、2行目を型、以降を値としてJSONに組み替えてます。
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ばかり使っていましたが、ストアアプリ版なら導入簡単だし。

でわ。