2016-08-15 3 views
2

У меня есть небольшой скрипт:JSON в CSV запись данных в файл CSV

require "csv" 
require "json" 

puts "JSON file name (include extension) ->" 
jsonfile = gets.chomp 

json = JSON.parse(File.open(jsonfile).read) 
#puts json.first.collect {|k,v| k}.join(',') 
puts json.collect {|node| "#{node.collect{|k,v| v}.join(',')}\n"}.join 

CSV.open("generated.csv", "wb") do |csv| 
    csv << json.collect {|node| "#{node.collect{|k,v| v}.join(',')}\n"}.join 
end 

В терминале он показывает, как это:

Missing: [User],{"error"=>[{"Something"=>"", "errno"=>"somthing", "de"=>"smoehting", "pe"=>"error", "errorMessage"=>"Missing "}], "data"=>nil} 
Missing: [User],{"error"=>[{"Something"=>"", "errno"=>"somthing", "de"=>"smoehting", "pe"=>"error", "errorMessage"=>"Missing "}], "data"=>nil} 

Мне нужно выводить каждую строку в отдельный ряд в файл csv. Выше было то, что я пытаюсь сделать, чтобы написать его в csv, но это не сработало

+1

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[mcve]». При запросе кода нам нужен минимальный код, необходимый для демонстрации проблемы, а также минимальные входные данные и ожидаемый результат. Без этого нам придется писать код для тестирования или собирать мнимые данные на основе того, что похоже на код, или будет генерировать вывод, который не связан с тем, что вы хотите. Все это приводит к неточностям и ответам, которые непосредственно не отвечают на проблему, поэтому нам нужно, чтобы вы сделали свою работу и помогли нам помочь вам и тем, кто ищет подобные решения в будущем. –

+0

«Не работает» каким-то конкретным способом? Не записывает ли файл? Напишите неправильный файл? Создать трассировку стека? –

ответ

1

Ваша первая ошибка в коде, так называемый << всего один раз. Каждый << создает одну строку, поэтому вам нужно вызвать метод << n-times, где n - это ряд строк.

Ваша вторая ошибка заключается в том, что вы объединяете элементы массива и пытаетесь передать строку в качестве аргумента <<. Каждый аргумент << должен быть массивом.

Подводя итог, чтобы создать файл CSV, содержащий две строки:

# my.csv 
1,2,3 
4,5,6 

вы должны написать:

CSV.open("my.csv", "wb") do |csv| 
    csv << [1, 2, 3] 
    csv << [4, 5, 6] 
end 

Аналогично, для достижения желаемого эффекта, попробуйте переписать код, как:

CSV.open("generated.csv", "wb") do |csv| 
    json.each do |node| 
    csv << node.collect { |k,v| v } 
    end 
end