2010-10-20 22 views
5

In python ho una gerarchia di oggetti complessa fatta di liste e dizionari. Voglio sputare tutto a CSV o qualche altro tipo di formato di database. Tutte le risposte in Python o Javascript sono molto apprezzate.Converti JSON in CSV

Capisco che un file CSV (o tabella) può rappresentare solo un "livello" di oggetto nella mia gerarchia, quindi la soluzione dovrebbe creare più file.

Ecco un esempio:

{ 
    "Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]}, 
       {"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}] 
} 

diventerebbe

Person.csv: 
id,name,age 
1,Greg,35 
2,Steve,28 

car.csv: 
id,Person_id,value 
1,1,honda civic 
2,1,ford focus 
3,2,mazda 323 
4,2,toyota camry 

In sostanza l'unica cosa interessante sta succedendo qui è l'assegnazione di nuovi ID in modo che le righe nelle tabelle possono essere associati.

Cheers, Dave

risposta

0

assegnazione di nuovi ID in modo che le righe nelle tabelle possono essere associate.

Come in:

  1. creare una chiave primaria (PK) per ogni riga.

  2. Creare una relazione chiave esterna (FK) tra auto e persona. Sembra che Car abbia una relazione "dipendente" sulla Persona.

Passaggio 1. Utilizzare enumerate sugli oggetti JSON. Questo ti darà un comodo PK per ogni persona.

Passaggio 2. Utilizzare il PK a portata di mano per ogni Persona come FK per ogni Auto creata.

L'unica cosa che è spiacevole è l'assegnazione di PK alle macchine poiché non c'è un modo pratico per utilizzare enumerate sulla tua particolare struttura di dati. Per questo, devi usare un buon vecchio contatore.

http://docs.python.org/library/functions.html#enumerate

2

provare qualcosa di simile.

json_dict = { 
    "Person" : [{"name":"Greg","age":"35","car":["honda civic","ford focus"]}, 
       {"name":"Steve","age":"28", "car":["mazda 323", "toyota camry"]}] 
} 

for entity in json_dict: 
    csv_file = open('%s.csv' % entity, 'wb') 
    headers = a[entity][0].keys() 
    csv_writer = csv.DictWriter(csv_file, headers) 
    map(csv_writer.writerow, json_dict[entity]) 
    csv_file.close() 

# Ora avete il vostro file json in csv per la formattazione potete usare awk;

awk -F , '{print NR ", " $2 ", " $3 }' Person.csv > person.csv 

...

0
import json 
import csv 
temp = json.load(open('filename.json','r')) 
output =[] 
for each in temp: 
    row = {} 
    row['field1'] =each['field1'] 
    row['field2'] = each['field2'] 
    output.append(row) 
file = open("filename_destination.csv", "w") 

fileWriter = csv.writer(file , delimiter=",",quotechar='"', quoting=csv.QUOTE_MINIMAL) 

Header = ['field1','field2'] 

fileWriter.writerow(Header) 

for x in output: 
te = [x['field1'],x['field2']] 
fileWriter.writerow(te) 
file.close() 
0

Ho appena rilasciato un modulo che rende questo processo facile in Node.js

var jsonexport = require('jsonexport'); 

var contacts = [{ 
    name: 'Bob', 
    lastname: 'Smith', 
    family: { 
     name: 'Peter', 
     type: 'Father' 
    } 
},{ 
    name: 'James', 
    lastname: 'David', 
    family:{ 
     name: 'Julie', 
     type: 'Mother' 
    } 
},{ 
    name: 'Robert', 
    lastname: 'Miller', 
    family: null, 
    location: [1231,3214,4214] 
},{ 
    name: 'David', 
    lastname: 'Martin', 
    nickname: 'dmartin' 
}]; 

jsonexport(contacts,function(err, csv){ 
    if(err) return console.log(err); 
    console.log(csv); 
}); 

https://www.npmjs.com/package/jsonexport