2011-03-18 31 views
11

Bir csv dosyasını bir json dosyasına dönüştürecek bir Ruby komut dosyasının nasıl yazılacağını bilen var mı?CSV to JSON Ruby Komut Dosyası?

CSV bu biçimde olacaktır:

Canon,Digital IXUS 70,"Epic, Epic 100",3x,Yes (lockable),Yes (lockable),Yes 
Canon, Digital IXUS 75,"Epic, Epic 100",3x,Yes (lockable),Yes (lockable),Yes 
Canon,Digital IXUS 80,"Epic, Epic 100",3x,Yes (lockable),Yes (lockable),Yes 

ve JSON bu yol açması gerekir:

{ "aaData": [ 
[ "Canon" , "Digital IXUS 70" , "3x" , "Yes (lockable)" , "Yes (lockable)" , "Yes"], 
[ "Canon" , "Digital IXUS 75" , "3x" , "Yes (lockable)" , "Yes (lockable)" , "Yes"], 
[ "Canon" , "Digital IXUS 80" , "3x" , "Yes (lockable)" , "Yes (lockable)" , "Yes"] 
]} 

cevap

40

Bu veriler CSV veri dizesi

olan yakut 1.9 kolaydır
require 'csv' 
require 'json' 

CSV.parse(data).to_json 
+0

teşekkürler çalışmıyor 1.8 için ve yükseltme yapamıyorum - 1.87 için doğru sözdizimi nedir? – webbydevy

+0

Gem 'fastercsv' öğesini kurun ve CSV'yi FasterCSV olarak değiştirin –

+0

'' 'data = File.open ('/ path/to/file.csv') .0 \' \ 'veri atamak için read''' veri ayıklamak – benjineer

16

gitmek için gelen:

Year,Make,Model,Description,Price 
1997,Ford,E350,"ac, abs, moon",3000.00 
1999,Chevy,"Venture ""Extended Edition""","",4900.00 
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00 
1996,Jeep,Grand Cherokee,"MUST SELL! 
air, moon roof, loaded",4799.00 

[ 
    {:year => 1997, :make => 'Ford', :model => 'E350', :description => 'ac, abs, moon', :price => 3000.00}, 
    {:year => 1999, :make => 'Chevy', :model => 'Venture "Extended Edition"', :description => nil, :price => 4900.00}, 
    {:year => 1999, :make => 'Chevy', :model => 'Venture "Extended Edition, Very Large"', :description => nil, :price => 5000.00}, 
    {:year => 1996, :make => 'Jeep', :model => 'Grand Cherokee', :description => "MUST SELL!\nair, moon roof, loaded", :price => 4799.00} 
] 

için bunu yapın:

csv = CSV.new(body, :headers => true, :header_converters => :symbol, :converters => :all) 
csv.to_a.map {|row| row.to_hash } 
#=> [{:year=>1997, :make=>"Ford", :model=>"E350", :description=>"ac, abs, moon", :price=>3000.0}, {:year=>1999, :make=>"Chevy", :model=>"Venture \"Extended Edition\"", :description=>"", :price=>4900.0}, {:year=>1999, :make=>"Chevy", :model=>"Venture \"Extended Edition, Very Large\"", :description=>nil, :price=>5000.0}, {:year=>1996, :make=>"Jeep", :model=>"Grand Cherokee", :description=>"MUST SELL!\nair, moon roof, loaded", :price=>4799.0}] 

Kredi: http://technicalpickles.com/posts/parsing-csv-with-ruby/

7

Josh'un Örneğin Bina, şimdi alabilir bir adım ileri CSV::table kullanarak:

extracted_data = CSV.table('your/file.csv') 
transformed_data = extracted_data.map { |row| row.to_hash } 

Şimdi hemen kullanmaya to_json aramak veya bir dosyaya yazabiliriz, güzel biçimlendirilmiş: Bir Raylar projesinde iseniz

File.open('your/file.json', 'w') do |file| 
    file.puts JSON.pretty_generate(transformed_data) 
end 
+0

' '' extracted_data = CSV.table ('sizin/dosya.csv', header_converters: nil) '' 'eğer başlıkları, deve haline getirmek ve sembollere dönüştürmek yerine, başlıkları orijinal dizeler olarak tutmak istiyorsanız – benjineer

2

CSV.parse(csv_string, {headers: true}) 
csv.map(&:to_h).to_json