2016-06-30 9 views
1

Ich habe gerade angefangen zu lernen JSON und wie man zwischen verschiedenen Dateitypen hin und her konvertieren.Anfänger suchen geschachtelt JSON

Wenn ich versuche, eine CSV-Datei zu JSON

Sprich zu konvertieren, wenn ich eine CSV-Datei von Menschen haben

(First name, Last name, age) 
David Chin 40 
David Lin 40 
David Ping 30 
Sandra Lee 25 
Sandra Long 45 

ich das JSON ohne Formatierung umwandeln kann.

Wie würde ich versuchen, die CSV in einen geschachtelten JSON zu konvertieren?

Hoffentlich Ausgabe aussehen würde

{"David":{ 
    "Chin": "40" 
     "Lin": "40" 
     "Ping": "30" 
}, 
"Sandra":{ 
     "Lee": "25" 
     "Long": "45"} 

} 

Gibt es einen bestimmten Code, wo ich frei die Konvertierung formatieren?

Jede Hilfe in die richtige Richtung ist willkommen oder Hinweise zum Formatieren von JSON funktionieren auch. Ich weiß einfach nicht, wo ich manipulieren würde, um dieses Format in die Ausgabe zu bekommen.

+0

JSON produzieren selbst nur ein Textdokument ist, ist es nicht ein Konzept des Schlüssels hat. Sie können es beliebig formatieren, was von Ihrem Anwendungsfall, Datenmodell und Ihrer Geschäftslogik abhängt. Fragen Sie, wie Sie den JSON aus der CSV erstellen können? – SArnab

+0

ja. Erstellen eines JSON aus dem CSV. –

+0

Haben Sie einen Versuch unternommen? In welcher Sprache versuchen Sie dies? Es gibt eine Reihe von Ansätzen, die Sie ergreifen können. Es gibt sogar automatisierte CSV-zu-JSON-Parser im Web. – SArnab

Antwort

0

Hier ist eine Lösung jq

Wenn die Datei filter.jq enthält

[ 
    split("\n")        # split string into lines 
| [.[0] | split(",")[]] as $headers  # split header 
| (.[1:][] | split(","))      # split data 
| select(length>0)       # eliminate blanks 
| [ [ $headers, . ]      # 
    | transpose[]       # assemble objects 
    | {key:.[0], value:.[1]}     # from keys and values 
    ] | from_entries       # 
] 
| reduce group_by(.First)[][] as $r (  # construct final result 
    {} 
    ; .[$r.First] = (.[$r.First]//{}) * {($r.Last):$r.Age} 
)  

und data enthält

First,Last,Age 
David,Chin,40 
David,Lin,40 
David,Ping,30 
Sandra,Lee,25 
Sandra,Long,45 

dann der Befehl

jq -M -R -s -r -f filter.jq data 
mit

wird den Ausgang

{ 
    "David": { 
    "Chin": "40", 
    "Lin": "40", 
    "Ping": "30" 
    }, 
    "Sandra": { 
    "Lee": "25", 
    "Long": "45" 
    } 
}