kakubei
kakubei

Reputation: 5400

ruby simple substitutions

very new to Ruby, I've got the following situation. I have a file with values separated by new lines, they look like this:

18917
18927
18929
...

I want to prepend a folder path to all of them, then grab the first 2 characters and prepend that as well, then the value in the file and then append a '.jpg' at the end so they would end up looking like this:

path/to/foler/18/18917.jpg

So I've code this ruby code:

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}" }

Now, this almost works, the part that is not working is the grabbing of the first 2 characters. I also tried it with the method outside quotes (and without the #{} of course) but it just produces an empty result.

Could someone please point out my folly?

Eventually I want to delete those images but I'm guessing that substituting 'File.delete' for 'puts' above would do the trick?

As usual, thanks in advance for taking the time to look at this.

Upvotes: 2

Views: 115

Answers (1)

Mischa
Mischa

Reputation: 43298

You don't seem to be understanding what collect does.

I would rewrite your snippet like this:

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

-- Update for last comment: --

If you don't want to use an if statement to check if a file exists before deleting it, you have two option (AFAIK).

Use 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

Or extend the File class with a delete_if_exists method. You can just put this at the top of your script:

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

With this, you can do:

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

Upvotes: 4

Related Questions