2012-08-28 1 views
0

Je suis nouveau à Ruby et j'avais une question. J'essaie de créer un fichier .rb qui convertit JSON en CSV.JSON à CSV via FasterCSV

je suis tombé sur des sources disparates qui me ont à faire:

require "rubygems" 
require 'fastercsv' 
require 'json' 

csv_string = FasterCSV.generate({}) do |csv| 
    JSON.parse(File.open("small.json").read).each do |hash| 
    csv << hash 
    end 
end 

puts csv_string 

Maintenant, il fait en fait le texte de sortie, mais ils sont tous soudées ensemble, sans espaces, virgules, etc. Comment puis-je le rendre plus personnalisé , effacer pour un fichier CSV afin que je puisse exporter ce fichier?

Le JSON ressemblerait à ceci:

 { 
      "results": [ 
       { 
        "reportingId": "s", 
        "listingType": "Business", 
        "hasExposureProducts": false, 
        "name": "Medeco Medical Centre World Square", 
        "primaryAddress": { 
         "geoCodeGranularity": "PROPERTY", 
         "addressLine": "Shop 9.01 World Sq Shopng Cntr 644 George St", 
         "longitude": "151.206172", 
         "suburb": "Sydney", 
         "state": "NSW", 
         "postcode": "2000", 
         "latitude": "-33.876416", 
         "type": "VANITY" 
        }, 

        "primaryContacts": [ 
         { 
          "type": "PHONE", 
          "value": "(02) 9264 8500" 
         } 
        ] 
       },xxx 
     } 

Le CSV d'avoir quelque chose comme:

 reportingId, s, listingType, Business, name, Medeco Medical...., addressLine, xxxxx, longitude, xxxx, latitude, xxxx, state, NSW, postcode, 2000, type, phone, value, (02) 92648544    
+1

À quoi ressemble le JSON? À quoi voulez-vous que le CSV ressemble? –

+0

juste mis à jour question mate. Ta – Doz

+0

C'est un format CSV bizarre - normalement CSV aurait des colonnes de clés dans la première ligne et des valeurs comme des colonnes dans les rangées suivantes (par conséquent mapper votre structure JSON imbriquée va être désordonné) –

Répondre

2

Étant donné que votre structure JSON est un mélange de hash et des listes, et a également des niveaux de différents hauteurs, ce n'est pas aussi trivial que le code que vous montrez. Cependant (en supposant que vos fichiers d'entrée se ressemblent toujours), il ne devrait pas être difficile d'écrire un convertisseur approprié. Au niveau le plus bas, vous pouvez transformer un hachage en CSV par

hash.to_a.flatten 

E.g.

input = JSON.parse(File.open("small_file.json").read) 
writer = FasterCSV.open("out.csv", "w") 
writer << input["results"][0]["primaryAddress"].to_a.flatten 

vous donnera

type,VANITY,latitude,-33.876416,postcode,2000,state,NSW,suburb,Sydney,longitude,151.206172,addressLine,Shop 9.01 World Sq Shopng Cntr 644 George St,geoCodeGranularity,PROPERTY 

espoir que vous guide la direction.

Btw, votre JSON semble invalide. Vous devez remplacer la ligne },xxx par }].

+0

Merci ouais je sais que c'est invalide mais c'est quelque chose qui vient d'un serveur hors de mon contrôle, mais je devrais regarder faire le mien comme ça. THanks pour cela – Doz

+0

Seul problème que je suis, il n'y a pas d'espace entre la valeur, puis la clé suivante ... en fonction de ce que j'ai, comment pouvez-vous ajouter cet espace supplémentaire? – Doz