Ruby создает файлы csv в новом подкаталоге

ОБНОВЛЕНИЕ НИЖЕ

У меня есть сценарий Ruby, который перебирает некоторый JSON и создает несколько файлов .CSV с данными. В настоящее время он просто создает их в той же папке, что и script/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
  }

---ОБНОВИТЬ---

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

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

Полный сценарий:

#!/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

person tehaaron    schedule 12.03.2013    source источник
comment
почему бы просто не включить имя каталога в открытый csv? out = CSV.open("#{outdir}/#{k}.csv", "w")   -  person Yuri Golobokov    schedule 12.03.2013
comment
@YuriyGolobokov Я сделал это редактирование, но я думаю, что проблема в том, где я это заявляю. Я обновил пост с дополнительной информацией и полным сценарием.   -  person tehaaron    schedule 12.03.2013


Ответы (1)


Это потому, что FileUtils.mkdir возвращает Array, когда вы можете создать один или несколько каталогов одновременно, он возвращает Array созданного каталога..

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

...
FileUtils.mkdir(time)
FileUtils.cd(time) do
  filename = k+".csv"
  out = CSV.open(filename, "w")
  csv.each{|item| out << item}
  out.close()
end
person toch    schedule 12.03.2013
comment
Это самое близкое к тому, что мне удалось заставить его работать, поскольку он создает каталог и создает первый CSV, но затем выдает ошибку 'mkdir': File Exists - 20130312131351 (Errno::EEXIST). Похоже, он пытается создать одну и ту же папку каждый раз, когда создает файл? - person tehaaron; 13.03.2013
comment
@tehaaron Используете ли вы последний фрагмент кода? Когда вы создаете каталог: в цикле или вне цикла? Вы получаете эту ошибку при повторном запуске сценария или во время выполнения сценария? - person toch; 13.03.2013
comment
Используйте блок с CSV.open вместо дискретного открытия и закрытия. Это путь Руби. - person the Tin Man; 13.03.2013
comment
@toch ой, у меня был mkdir в цикле. У меня изначально это произошло заранее. Вернул на прежнее место и все заработало. Спасибо! - person tehaaron; 13.03.2013