Stefano Crocco
5/25/2008 8:30:00 PM
On Sunday 25 May 2008, koichirose wrote:
> Today I started programming in ruby.
> Here's what I managed to do so far:
>
> string = Dir.entries(".")
> string.delete_at(0)
> string.delete_at(0)
>
> 1. I get a list of files
> 2-3. I delete the first two elements ('.' and '..')
>
> Now my files are all like "something - some other thing"
> I want to split them:
>
> string.each do |s|
> puts s.split("-")[0]
> end
>
> So it outputs the "something" part in my filenames.
> Now I'd like to remove duplicate entries (.uniq method right?).
> Can it be done in a single line? If not, how do i get an array
> containing only the "something" part to work on with .uniq?
>
> I tried with some loops, to create a new array with the splitted string
> in it, but my PHP approach doesn't work:
> i = 0
> for i in string
> splitted[i] = i.split("-")[0]
> i += 1
> end
>
> Thank you!
If I understand you correctly, this (untested) should do what you want:
Dir.entries('.')[2..-1].map{|f| f.split('-')[0]}.uniq
Dir.entries('.')[2..-1]
returns an array containing all the contents of the current directory except
the first two entries (actually, the [] method of an array, when called with a
range returns all the elements of the array from the first index to the last.
Since negative indexes count from right to left, with the rigthmost element
having index -1, here you get all the entries from 2 to the last). This avoids
the two calls to delete_at.
Then map is called on the array with the names of the files. Array#map passes
each element of the array to the block and returns an array containing the
values returned by the block for each element. In this case, each element is a
string of the form 'something-something_else'. The block splits the name of
the file on the '-' character, then takes (and implicitly returns) the first
half (thanks to the [0]). This means that map returns an array containing all
the first parts of the file names (the ones you want).
After that, we call uniq on the array, creating a new array without
duplicates.
I hope this helps
Stefano