红宝石简单换人

时间:2011-10-20 13:37:23

标签: ruby

对Ruby来说很新,我有以下情况。我有一个文件,其值由新行分隔,它们如下所示:

18917
18927
18929
...

我想在它们之前添加一个文件夹路径,然后抓住前2个字符并将其添加到文件中,然后在文件中添加一个'.jpg',这样它们最终会看起来像像这样:

路径/到/ foler / 18 / 18917.jpg

所以我编写了这个ruby代码:

folder = "/path/to/folder" 
lines = File.readlines("values.csv")
images = lines.collect.to_s.gsub("\n", ".jpg,") 
images.split(',').collect { |dogtag |  puts "bad dog: #{folder}/#{dogtag[0,2]}/#{dogtag}" }

现在,这几乎可以工作,不起作用的部分是抓住前2个字符。我也尝试用引号外的方法(当然没有#{}),但它只产生一个空结果。

有人可以指出我的愚蠢吗?

最终我想要删除这些图片,但我猜测用'File.delete'替换上面的'puts'可以解决这个问题吗?

像往常一样,提前感谢花时间看这个。

1 个答案:

答案 0 :(得分:4)

您似乎并不了解collect的作用。

我会像这样重写你的代码片段:

File.read("values.csv").each do |line|
  puts "bad dog: /path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
end

- 更新最后评论: -

如果您不想在删除文件之前使用if语句检查文件是否存在,则有两个选项(AFAIK)。

使用rescue

File.read("values.csv").each do |line|
  begin
    File.delete "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
  rescue Errno::ENOENT
    next
  end
end

或者使用File方法扩展delete_if_exists类。您可以将它放在脚本的顶部:

class File
  def self.delete_if_exists(f)
    if exists?(f)
      delete(f)
    end
  end
end

有了这个,你可以这样做:

File.read("values.csv").each do |line|
  File.delete_if_exists "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
end