2013-03-30 5 views
0

Кто-то прислал мне этот код для преобразования из json в формат csv.Ошибка при преобразовании из формата json2cvs

Код кода 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 data.Which я сохранил, как 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, location, я tem_name, item_unit_price, item_description, quantity, billing_date.

Это долгое время рассматривалось. Мне нужно получить это завершено сегодня. Помогите.

+0

Ваш вход состоит из * нескольких * JSON записей, в то время как код может обрабатывать только отдельные структуры данных JSON. Возможно, вам нужно прочитать свой входной файл * на строку *? –

+0

как это сделать? –

+0

Код, который вы отправили, не соответствует структуре данных в вашем файле JSON * вообще *.В нем нет, например, 'item_id', или' name_part'. Ваша структура JSON также * вложенная *, что не будет хорошо переводиться в CSV. –

ответ

1

Есть несколько проблем здесь:

  1. Ваши данные JSON на самом деле несколько Данные в формате JSON. Это будет сложно исправить, если у вас много данных, хотя предложение Martijns по чтению в строке может помочь, если данные действительно являются одним JSON-сопоставлением на строку. В противном случае данные должны быть закреплены, например:

    [{"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.

+0

Вся идея заключается в том, чтобы импортировать данные csv в sql-сервер. Есть ли способ сохранить эти json-объекты в виде полей в таблице в sql напрямую? –

+0

@AnithaYedavalli: Да, переход через CSV, вероятно, не пригодится в этом случае. Вы по-прежнему должны в качестве первого шага сделать сопоставление данных JSON и данных SQL. После этого создание сценария импорта довольно тривиально. –

Смежные вопросы