2013-03-12 74 views
1

更新下红宝石在新的子目录

创建CSV文件,我有一个是通过一些循环JSON和创建与数据的多个.CSV文件的Ruby脚本。目前它只是创建与脚本/ 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模块文档我看你可以创建/在另一个direcotry书面形式向他们申报的路径读取的CSV但没有。这是我第一次使用这个模块。有谁知道如何解决这个问题?

我想我需要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”)' – 2013-03-12 17:40:15

+0

@YuriyGolobokov我做了那个编辑,但我认为这个问题是我声明它的地方。我用更多的信息和完整的脚本更新了这篇文章。 – tehaaron 2013-03-12 18:52:45

回答

2

这是因为FileUtils.mkdir返回Arraycan 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':文件存在 - 20130312131351(Errno :: EEXIST)'。看起来它每次创建文件时都试图创建相同的文件夹? – tehaaron 2013-03-12 20:16:58

+0

@tehaaron是您的最后一个代码段使用一个?你什么时候创建目录:在循环中还是在循环中?当您再次运行脚本或脚本期间,您是否遇到该错误? – toch 2013-03-12 22:17:17

+0

使用带'CSV.open'而不是离散开闭块。这是Ruby的方式。 – 2013-03-12 22:43:31