2013-03-30 6 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) 

은 여기에 누군가가 가져 오는 코드를 수정할 수 있다면 나는 오류

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

있어 c:\python.exe c:\json2csv.py c:\transaction.json c:\transaction.txt 일을 시도 내가 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} 

저장된 data.Which 내 JSON의 모든 분야는 훌륭합니다. CSV의 모든 필드가 필요하지 않습니다. 단지 client_external_id, invoice_clinician_id, invoice_id, location,, item_unit_price, item_description, quantity, billing_date 만 있으면됩니다.

이것은 오랫동안 보류되어 왔습니다. 오늘 완료해야합니다. 도움이됩니다. 여러 문제가 여기에있다

+0

입력 내용은 * 여러 * JSON 항목으로 구성되지만 코드는 단일 JSON 데이터 구조 만 처리 할 수 ​​있습니다. 라인 당 입력 파일 *을 읽을 필요가있을 것입니다. –

+0

어떻게해야합니까? –

+0

보낸 코드가 JSON 파일 *의 데이터 구조와 일치하지 않습니다.거기에'item_id' 키가 없으며, 예를 들어'name_part'도 없습니다. JSON 구조도 * 중첩 *되어 CSV로 잘 변환되지 않습니다. –

답변

1

있습니다

  1. 귀하의 JSON 데이터는 실제로 여러 JSON의 datas입니다. 데이터가 많은 경우 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로이 결과를 얻을 수 :

"[{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}]" 

: 당신의 invoice_payments 데이터를 문자열로 변환 된 방법

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 

주 CSV를 가져 오는 것은 아무 것도 만들지 않습니다. 그 어떤 실제적인 의미. JSON 데이터를 쉽게 CSV로 변환 할 수는 없으므로 CSV 데이터의 모양을 결정하고 지정해야합니다.

+0

전체 아이디어는 csv 데이터를 sql 서버로 가져 오는 것입니다.이 json 개체를 SQL의 테이블에있는 필드로 직접 저장하는 방법이 있습니까? –

+0

@AnithaYedavalli : 예, CSV를 통해가는 것은이 경우 유용하지 않을 수 있습니다. 첫 번째 단계로 JSON 데이터와 SQL 데이터를 매핑해야합니다. 그 다음에는 가져 오기 스크립트를 만드는 것이 상당히 쉽습니다. –

관련 문제