Moving files into alphabetical directories

Hi. Let's say I have an array like this:

irb(main):008:0> letters
=> ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

and another array like this:

irb(main):001:0> names = %w(simon sadie tyler kirsty kevin keith)
=> ["simon", "sadie", "tyler", "kirsty", "kevin", "keith"]

I'd like to end up with either an array or a hash that contains all
letters of the alphabet (letters) with the matching files (names) and
maybe nil for the letters with no value. I hope this makes sense.

As per the subject, this is initially wanted for the purposes of moving
files into directories. However, as FileUtils.mv happily takes an array
(or a hash?), it'd be nice to know how to do this generally.

Thanks for any assistance.

···

--
Posted via http://www.ruby-forum.com/.

Hi. Let's say I have an array like this:

irb(main):008:0> letters
=> ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

and another array like this:

irb(main):001:0> names = %w(simon sadie tyler kirsty kevin keith)
=> ["simon", "sadie", "tyler", "kirsty", "kevin", "keith"]

I'd like to end up with either an array or a hash that contains all
letters of the alphabet (letters) with the matching files (names) and
maybe nil for the letters with no value. I hope this makes sense.

By matching file names you mean the ones starting with that letter?
A way to get a hash that contains a key for each letter with an array
of words starting with that letter:

h = {}
names.each do |name|
  letter = name[0,1].upcase #seems the letters must be upcased
  (h[letter] ||= ) << name
end

For the letters that don't get any word, it depends what you want to
do with that. In this solution you will get nil if you try to access
it.

As per the subject, this is initially wanted for the purposes of moving
files into directories. However, as FileUtils.mv happily takes an array
(or a hash?), it'd be nice to know how to do this generally.

Then you can iterate the hash and call FileUtils.mv for each directory
like this:

h.each {|directory, files| FileUtils.mv files, directory}

Hope this helps,

Jesus.

···

On Wed, Oct 19, 2011 at 9:53 PM, simon harrison <simonharrison.uk@gmail.com> wrote:

Very helpful as always, Jesus. Thanks.

···

--
Posted via http://www.ruby-forum.com/.

A way to get a hash that contains a key for each letter with an array
of words starting with that letter:

h = {}
names.each do |name|
letter = name[0,1].upcase #seems the letters must be upcased
(h[letter] ||= ) << name
end

This is a good place to use Enumerable#group_by.

    >> names = %w(simon sadie tyler kirsty kevin keith)
    => ["simon", "sadie", "tyler", "kirsty", "kevin", "keith"]
    >> names.group_by { |n| n[0,1].upcase }
    => {"K"=>["kirsty", "kevin", "keith"], "S"=>["simon", "sadie"],
"T"=>["tyler"]}

···

On Oct 19, 4:47 pm, Jesús Gabriel y Galán <jgabrielyga...@gmail.com> wrote:

--
-yossef

Quite true !
Thanks for the reminder.

Jesus.

···

On Thu, Oct 20, 2011 at 12:43 AM, Yossef Mendelssohn <ymendel@pobox.com> wrote:

On Oct 19, 4:47 pm, Jesús Gabriel y Galán <jgabrielyga...@gmail.com> > wrote:

A way to get a hash that contains a key for each letter with an array
of words starting with that letter:

h = {}
names.each do |name|
letter = name[0,1].upcase #seems the letters must be upcased
(h[letter] ||= ) << name
end

This is a good place to use Enumerable#group_by.

>> names = %w(simon sadie tyler kirsty kevin keith)
=> ["simon", "sadie", "tyler", "kirsty", "kevin", "keith"]
>> names.group_by { |n| n[0,1].upcase }
=> {"K"=>["kirsty", "kevin", "keith"], "S"=>["simon", "sadie"],
"T"=>["tyler"]}

Has #group_by been integrated into Ruby?

Last I heard, it was still only available as part
of ActiveSupport although there was talk of working
it into 1.9.

Dan Nachbar

···

On Oct 19, 2011, at 6:43 PM, Yossef Mendelssohn wrote:

This is a good place to use Enumerable#group_by.

Has #group_by been integrated into Ruby?

Last I heard, it was still only available as part
of ActiveSupport although there was talk of working
it into 1.9.

It is part of core. Fairly easy to check:

$ irb

RUBY_VERSION

=> "1.9.2"

Enumerable.instance_methods.grep(/group/)

=> [:group_by]

$ irb

RUBY_VERSION

=> ["group_by"]

Plus ri, if you have it working.

···

On Thu, Oct 20, 2011 at 1:27 PM, Dan Nachbar <dan@nachbar.com> wrote:

$ irb
>> RUBY_VERSION
=> ["group_by"]

Whoops. Overzealous editing.

Enumerable.instance_methods.grep(/group/)

=> ["group_by"]

···

On Thu, Oct 20, 2011 at 1:39 PM, Adam Prescott <adam@aprescott.com> wrote:

Doh!
When I went looking for #group_by in irb, I erroneously used
Array.methods rather than Array.instance_methods

Sorry for the noise.

Dan

···

On Oct 20, 2011, at 8:39 AM, Adam Prescott wrote:

On Thu, Oct 20, 2011 at 1:27 PM, Dan Nachbar <dan@nachbar.com> wrote:

Has #group_by been integrated into Ruby?

It is part of core. Fairly easy to check: