2013-03-12 3 views
1

UPDATE НИЖЕрубин создать CSV-файлы в новой папке

У меня есть сценарий Ruby, который зацикливание через некоторые JSON и создание нескольких файлов .CSV с данными. В настоящее время он просто создает те, которые находятся в той же папке, что и скрипт/JSON. Тем не менее, я хочу, чтобы он создавал файлы во вновь создаваемом подкаталоге с меткой времени.

Я знаю, что нужно require 'fileutils.rb' и я создал time = Time.now.strftime("%Y%m%d%H%M%S%") и outdir = FileUtils.mkdir(time)

Я добавил это в мой сценарий, и он успешно создает каталог, а затем ломается.

Конец сценария, который создает файлы выглядит как это, и я думаю, что проблема, как я буду о переходе в каталог/создания файлов в новой директории:

... 
    outdir = FileUtils.mkdir(time) 
    FileUtils.cd(outdir) do #I think this is wrong 
     filename = k+".csv" 
     out = CSV.open(filename, "w") 
     csv.each{|item| out << item} 
     out.close() 
    end 
    } 

- -UPDATE ---

Похоже, что проблема заключается в том, что я указываю путь пути и модуль CSV. Я получаю сообщение об ошибке Invalid argument - ["20130312113853"]/regions.csv (Errono::EINVAL) Когда я смотрю на документы модуля CSV, я вижу, что вы можете объявить путь для чтения CSV, но ничего не создавать и писать для них в другом обращении. Это первый раз, когда я использовал этот модуль. Кто-нибудь знает, как подойти к этому?

Я думаю, что мне нужно объявить путь dir для csv до csv = []?

Fullscript:

#!/usr/bin/env ruby 

require 'json' 
require 'csv' 
require 'fileutils.rb' 

file = "parse_me.json" 

ff = JSON.parse(File.open(file).read) 
time = Time.now.strftime("%Y%m%d%H%M%S") 
outdir = FileUtils.mkdir(time) 
begin 
    ff.each{|k,h| 
    csv = [] 
    csv << h[0].keys 
    h.each{|arr| 
     holder = [] 
     arr.each_value{|v| 
     holder << v 
     } 
    csv << holder 
    } 
     out = CSV.open("#{outdir}/#{k}.csv", "w") 
     csv.each{|item| out << item} 
     out.close() 
    } 
end 
+3

почему бы не просто включить имя_директории в CSV-файл открыт? 'out = CSV.open (" # {outdir}/# {k} .csv "," w ")' –

+0

@YuriyGolobokov Я сделал это редактирование, но я думаю, что проблема в том, где я его объявляю. Я обновил сообщение с дополнительной информацией и полным скриптом. – tehaaron

ответ

2

Это потому, что FileUtils.mkdir возвращает Array как вы can create one or more directories in a same time, it returns an Array of the directory created..

Если вы просто работать с time непосредственно, ваш код должен работать

... 
FileUtils.mkdir(time) 
FileUtils.cd(time) do 
    filename = k+".csv" 
    out = CSV.open(filename, "w") 
    csv.each{|item| out << item} 
    out.close() 
end 
+0

Это ближайший я получил, чтобы заставить его работать, поскольку он создает каталог и создает первый CSV, но затем дает ошибку '' mkdir ': File Exists - 20130312131351 (Errno :: EEXIST) '. Кажется, он пытается создать одну и ту же папку каждый раз, когда создает файл? – tehaaron

+0

@tehaaron Является ли ваш последний фрагмент кода тем, который вы используете? Когда вы создаете каталог: в цикле или в цикле? Получаете ли вы эту ошибку при повторном запуске скрипта или во время сценария? – toch

+0

Используйте блок с 'CSV.open' вместо дискретного открытия и закрытия. Это рубиновый путь. –

Смежные вопросы