chris
8/17/2007 2:25:00 PM
On 17 Aug., 11:05, "Robert Klemme" <shortcut...@googlemail.com> wrote:
> 2007/8/17, Christian <oz...@web.de>:
>
>
>
> > I have a lot of files in an folder and want loop over the files in a
> > special way:
>
> > Dir.entries("f:/test/").each { |e| filenames.push(e[3..50])}
>
> > Now i have an array with the distinct names like:
> > a.txt
> > b.txt
> > c.txt
> > d.txt
> > ...
> > z.txt
>
> > , but every file "have 20 parts" which i have to proceed:
> > 00_a.txt
> > 01_a.txt
> > 02_a.txt
> > ..
> > 19_a.txt
>
> > for i in 0..19
> > filenames.map{ |t| if i < 10 then p "0#{i}_#{t}" else p
> > "#{i}_#{t}" end }
> > end
>
> > I find something about MultiValuedHash, but i didn't know how i get my
> > structure (....the distinct names are the keys and the 20 parts for
> > every key as values ) like the raw_data in an easy way.
>
> > raw_data=[[1,'a'],[1,'b'],[1,'c'],[2,'a'],[2,['b','c']],
> > [3,'c']]
>
> > class MultiValuedHash < Hash
> > def []=(key,value)
> > if has_key?(key)
> > super(key,[value,self[key]].flatten)
> > else
> > super
> > end
> > end
> > end
>
> > hash=MultiValuedHash.new
> > raw_data.each{ |x,y| hash[x]=y }
>
> This is shorter and more efficient:
>
> hash = Hash.new {|h,k| h[k] = []}
> raw_data.each{ |x,y| hash[x] << y }
>
> And you even do not need a new class. :-)
>
> Kind regards
>
> robert
many thanks for the trick
But have anybody an advice how i get the filenames a.txt, b.txt ....
as key and the parts 00_a.txt , 01_a.txt, 02_a.txt as values for
every key.
i identify a mistake to get the unique names i have to:
Dir.entries("f:/base_data/ADS20/outputdaten/").each { |e|
files.push(e[3..50])}
filenames.push(files.select{|e| files.index(e) !=
files.rindex(e)}.uniq)
many thanks & regards
Christian