3

私はすでにCreate nested JSON from flat csvを読みましたが、私の場合は役に立ちませんでした。

Google Docs で作成した 11 行 74 列 (いくつかの列は占有されていません) の非常に大きなスプレッドシートがあります。

Google ドライブで例を作成しました。としてエクスポートすると、CSV次のようになります。

id,name,email,phone,picture01,picture02,picture03,status
1,Alice,alice@gmail.com,2131232,"image01_01
[this is an image]",image01_02,image01_03,single
2,Bob,bob@gmail.com,2854839,image02_01,"image02_02
[description to image 2]",,married
3,Frank,frank@gmail.com,987987,image03_01,image03_02,,single
4,Shawn,shawn@gmail.com,,image04_01,,,single

今、私はJSON次のような構造を持ちたいと思っています:

{
    "persons": [
        {
            "type": "config.profile",
            "id": "1",
            "email": "alice@gmail.com",
            "pictureId": "p01",
            "statusId": "s01"
        },
        {
            "type": "config.pictures",
            "id": "p01",
            "album": [
                {
                    "image": "image01_01",
                    "description": "this is an image"
                },
                {
                    "image": "image_01_02",
                    "description": ""
                },
                {
                    "image": "image_01_03",
                    "description": ""
                }
            ]
        },
        {
            "type": "config.status",
            "id": "s01",
            "status": "single"
        },
        {
            "type": "config.profile",
            "id": "2",
            "email": "bob@gmail.com",
            "pictureId": "p02",
            "statusId": "s02"
        },
        {
            "type": "config.pictures",
            "id": "p02",
            "album": [
                {
                    "image": "image02_01",
                    "description": ""
                },
                {
                    "image": "image_02_02",
                    "description": "description to image 2"
                }
            ]
        },
        {
            "type": "config.status",
            "id": "s02",
            "status": "married"
        }
    ]
}

他の行についても同様です。

私の理論的なアプローチは、CSV行ごとにファイルを調べることです (ここで最初の問題が始まります: 現在、すべての行は 1 行ですが、場合によっては複数の行に等しいため、コンマを数える必要がありますか?)。各行は、 、、、およびconfig.profileを含む のブロックと同じです(後者の 2 つは行番号に応じて生成されます)。idemailpictureIdstatusId

次に、行ごとに、ブロックに挿入されたものconfig.picturesと同じブロックが生成されます。は、与えられた写真と同じ数の要素の配列です。idconfig.profilealbum

最後に、各行にはconfig.statusブロックがあり、これも でid指定されたものと同じで、対応するステータスconfig.profileを持つ の 1 つのエントリがあります。status

ネストされた条件付きの JSON ファイルを作成する方法がまったくわかりません。

、、 などのように、 で直接指定されていないネストや追加情報なしで、CSVを validに変換するところまで来ました。JSONCSVtypepictureIdstatusId

どんな助けでも大歓迎です。これを別のスクリプト言語 ( ruby.

誰かがこれが宿題か何かだと思う前に。そうではない。そうでなければ非常に面倒なコピー&ペースト作業を自動化したいだけです。

4

1 に答える 1

11

このcsvモジュールは、引用符内の改行の処理を含め、CSV の読み取りを適切に処理します。

import csv
with open('my_csv.csv') as csv_file:
   for row in csv.reader(csv_file):
       # do work

オブジェクトは反復子です。ループcsv.readerを使用して、CSV 内の行を反復処理できます。for各行はリストであるため、各フィールドを 、 などとして取得できますrow[0]row[1]これにより、最初の行が読み込まれることに注意してください (この場合、フィールド名のみが含まれます)。

最初の行にフィールド名が与えられているので、各行のフィールドに 、 などとしてアクセスできるように使用できcsv.DictReaderます。これにより、最初の行もスキップされます。row['id']row['name']

import csv
with open('my_csv.csv') as csv_file:
   for row in csv.DictReader(csv_file):
       # do work

JSON エクスポートの場合は、jsonモジュールを使用します。json.dumps()リストや辞書などの Python データ構造を取り、適切な JSON 文字列を返します。

import json
my_data = {'id': 123, 'name': 'Test User', 'emails': ['test@example.com', 'test@hotmail.com']}
my_data_json = json.dumps(my_data)

投稿したとおりに JSON 出力を生成したい場合は、次のようにします。

output = {'persons': []}
with open('my_csv.csv') as csv_file:
    for person in csv.DictReader(csv_file):
        output['persons'].append({
            'type': 'config.profile',
            'id': person['id'],
            # ...add other fields (email etc) here...
        })

        # ...do similar for config.pictures, config.status, etc...

output_json = json.dumps(output)

output_json必要な JSON 出力が含まれます。

ただし、求めている JSON 出力の構造を慎重に検討することをお勧めします。現時点では、何の役にも立たない外部辞書を定義しており、すべてconfigのデータを ' ' の直下に追加しています。 persons' - これを再考することをお勧めします。

于 2013-06-11T12:10:33.240 に答える