0

誰かがこのコードを送って、json から csv 形式に変換しました。

json2csv のコードは次のとおりです。

import sys, json, csv

input = open(sys.argv[1])
json_array = json.load(input)
input.close()

item_data = json_array
if len(item_data) >= 1:
    first_item_id = item_data[0]['item_id']
    columns = item_data[0].keys()

csv_file = open(sys.argv[2], "wb")
writer = csv.writer(csv_file)
# there is currently a known bug where column names are partially uppercase, this    will  be fixed soon. the "map(lambda x: x.lower(), columns)" fixes this issue in the mean time
writer.writerow(map(lambda x: x.lower(), columns)) 

# here .items() is a standard python function
for item in item_data:
    row = []
    for column_name in columns:
        if column_name.lower() == 'name_part': # lower required due to above issue
            row.append(" ".join(item[column_name]))
        else:
            row.append(item[column_name])
    writer.writerow(row)

これが私のjsonデータです。これをtransaction.jsonとして保存しました

{"comment": "Developer test ", "invoice_intern_external_ids": "", "invoice_payments": [{"payment_id": 8, "payment_method": "Refund", "timestamp": "2013-03-05", "invoice_id": 12, "writeoff_reason": "", "payment": 160.0}, {"payment_id": 9, "payment_method": "Cash", "timestamp": "2013-03-05", "invoice_id": 12, "writeoff_reason": "", "payment": 160.0}], "tax": 0.0, "pay_to_external_id": -1, "total": 0.0, "pay_to_contact_id": 13, "client_external_id": 11, "is_draft": false, "invoice_clinician_external_id": 999925, "location": "Therapy A", "invoice_clinician_id": 7, "bill_to_external_id": 11, "timestamp": "2013-03-05", "client_contact_id": 16, "subtotal": 0.0, "invoice_id": 26, "write_off": 0.0, "invoice_items": [{"item_tax": 0.0, "item_name": "InitialVisit_O", "timestamp": "2013-03-05", "item_unit_price": 160.0, "tax": 0.0, "invoice_item_id": 21, "invoice_instance_id": 26, "total": 0.0, "subtotal": 0.0, "item_description": "Initial Assessment/hour", "quantity": 0.0}], "billing_date": "2013-03-05", "invoice_intern_ids": "[]", "bill_to_contact_id": 16, "balance": 0.0, "invoice_instance_id": 12}
{"comment": "", "invoice_intern_external_ids": null, "invoice_payments": [], "tax": 0.0, "pay_to_external_id": -1, "total": 260.0, "pay_to_contact_id": 13, "client_external_id": -1, "is_draft": false, "invoice_clinician_external_id": null, "location": "Sports Medicine", "invoice_clinician_id": 7, "bill_to_external_id": -1, "timestamp": "2013-02-25", "client_contact_id": 15, "subtotal": 260.0, "invoice_id": 23, "write_off": 0.0, "invoice_items": [{"item_tax": 0.0, "item_name": "CompAsses", "timestamp": "2013-02-25", "item_unit_price": 260.0, "tax": 0.0, "invoice_item_id": 36, "invoice_instance_id": 23, "total": 260.0, "subtotal": 260.0, "item_description": "Comp Assess Report", "quantity": 1.0}], "billing_date": "2013-02-22", "invoice_intern_ids": "[]", "bill_to_contact_id": 15, "balance": 260.0, "invoice_instance_id": 10}

私はやってc:\python.exe c:\json2csv.py c:\transaction.json c:\transaction.txt みましたが、エラーが発生しました

Extra data line2 column 1 - line 12 column1 (char 1105 - char 11267)

誰かがすべてのフィールドを取得するようにコードを修正できれば、それは素晴らしいことです。私はcsvのすべてのフィールドさえ必要としません。client_external_id, invoice_clinician_id, invoice_id, , locationi tem_name, item_unit_price, item_description,だけが必要です。quantitybilling_date

これは長い間保留されていました。今日これを完了する必要があります。助けてください。

4

1 に答える 1

1

ここには複数の問題があります。

  1. JSON データは、実際には複数の JSON データです。データが実際には 1 行に 1 つの JSON マッピングであると仮定すると、行ごとに読み取るという Martijns の提案は役立つかもしれませんが、大量のデータがある場合、これを修正するのは困難です。それ以外の場合は、次のようにデータを修正する必要があります。

    [{"comment": "Developer test ", "invoice_intern_external_ids": "" ...},
     {"comment": "", "invoice_intern_external_ids": null, ...}]
    

    開き括弧と閉じ括弧、および各 JSON {} の後のコンマ (最後のものを除く) に注意してください。

  2. 与えられたスクリプトは特に一般的ではありません。指定された最初の JSON オブジェクトに「item_id」があると想定していますが、これはありません。しかし、それは修正可能です。

  3. Invoice_payments データは辞書のリストです。これは、データが階層的であることを意味します。データの単純なリストである CVS にどのように変換しますか? それは明らかではありません。表示するスクリプトはそれを処理しません。これは一般的なものであり、json データがフラットであることを前提としています。

固定コンバーター:

import sys, json, csv

input = open(sys.argv[1])
json_array = []
for data in input.readlines():
     json_array.append(json.loads(data))
input.close()

item_data = json_array
if len(item_data) >= 1:
    columns = item_data[0].keys()

csv_file = open(sys.argv[2], "wb")
writer = csv.writer(csv_file)
# there is currently a known bug where column names are partially uppercase, this    will  be fixed soon. the "map(lambda x: x.lower(), columns)" fixes this issue in the mean time
writer.writerow(map(lambda x: x.lower(), columns)) 

# here .items() is a standard python function
for item in item_data:
    row = []
    for column_name in columns:
        if column_name.lower() == 'name_part': # lower required due to above issue
            row.append(" ".join(item[column_name]))
        else:
            row.append(item[column_name])
    writer.writerow(row)

この結果を CSV として生成します。

comment,invoice_intern_external_ids,invoice_payments,tax,pay_to_external_id,total,pay_to_contact_id,client_external_id,is_draft,invoice_clinician_external_id,location,invoice_instance_id,invoice_clinician_id,bill_to_external_id,timestamp,client_contact_id,subtotal,invoice_id,write_off,invoice_items,invoice_intern_ids,bill_to_contact_id,balance,billing_date
Developer test ,,"[{u'payment_id': 8, u'payment_method': u'Refund', u'invoice_id': 12, u'timestamp': u'2013-03-05', u'writeoff_reason': u'', u'payment': 160.0}, {u'payment_id': 9, u'payment_method': u'Cash', u'invoice_id': 12, u'timestamp': u'2013-03-05', u'writeoff_reason': u'', u'payment': 160.0}]",0.0,-1,0.0,13,11,False,999925,Therapy A,12,7,11,2013-03-05,16,0.0,26,0.0,"[{u'item_tax': 0.0, u'item_name': u'InitialVisit_O', u'timestamp': u'2013-03-05', u'item_unit_price': 160.0, u'tax': 0.0, u'subtotal': 0.0, u'invoice_item_id': 21, u'total': 0.0, u'invoice_instance_id': 26, u'item_description': u'Initial Assessment/hour', u'quantity': 0.0}]",[],16,0.0,2013-03-05
,,[],0.0,-1,260.0,13,-1,False,,Sports Medicine,10,7,-1,2013-02-25,15,260.0,23,0.0,"[{u'item_tax': 0.0, u'item_name': u'CompAsses', u'timestamp': u'2013-02-25', u'item_unit_price': 260.0, u'tax': 0.0, u'subtotal': 260.0, u'invoice_item_id': 36, u'total': 260.0, u'invoice_instance_id': 23, u'item_description': u'Comp Assess Report', u'quantity': 1.0}]",[],15,260.0,2013-02-22

Invoice_payments データがどのように文字列に変換されたかに注意してください。

"[{u'payment_id': 8, u'payment_method': u'Refund', u'invoice_id': 12, u'timestamp': u'2013-03-05', u'writeoff_reason': u'', u'payment': 160.0}, {u'payment_id': 9, u'payment_method': u'Cash', u'invoice_id': 12, u'timestamp': u'2013-03-05', u'writeoff_reason': u'', u'payment': 160.0}]",0.0,-1,0.0,13,11,False,999925,Therapy A,12,7,11,2013-03-05,16,0.0,26,0.0,"[{u'item_tax': 0.0, u'item_name': u'InitialVisit_O', u'timestamp': u'2013-03-05', u'item_unit_price': 160.0, u'tax': 0.0, u'subtotal': 0.0, u'invoice_item_id': 21, u'total': 0.0, u'invoice_instance_id': 26, u'item_description': u'Initial Assessment/hour', u'quantity': 0.0}]"

CSV をインポートしても、実際には意味がありません。JSON データを簡単に CSV に変換することはできません。CSV データの外観を決定して指定する必要があります。

于 2013-03-30T14:21:35.133 に答える