2010-09-07 2 views
3

J'ai 5 fichiers file1.txt file2.txt....file5.txt, j'ai liste des 3 mots red white bluecomment recueillir type de données avec les scripts Ruby

Je cherche à savoir combien de fois et dans quels fichiers red white blue se produisent.

Enfin, le format devrait être:

red = file1.txt, file3.txt, 2 
white = file2.txt, 1 
blue = file1.txt, file2.txt, file3.txt, 3 

C'est ce que j'ai jusqu'à présent:

files.each do |i| 
    curfile = File.new("#{i}","r") 
    while (line = curfile.gets) 
     mywords.each do |j| 
      if (line ~= /\b#{j}\b/) 
       ##what kind of data structure should I put the results in?? 
      end 
     end 
    end 
end 

Quel type de structure de données dois-je mettre les résultats en?

+0

Qu'en est-il de lister les fichiers dans un tableau pour chaque couleur? Donc 'red = [" file1.txt "," file3.txt "]' et ainsi de suite. Ensuite, utilisez 'red.length' pour afficher le nombre de fois qu'ils apparaissent. –

+0

Travail à domicile? Utilisez un hachage où chaque clé est la couleur et la valeur associée de cette clé est incrémentée de 1 pour le nombre de fois que chaque couleur est vue. – dawg

+0

@drewk: Poser des hachages multidimensionnels est une question légitime. Je ne pense pas qu'il existe encore une réponse satisfaisante pour ruby. –

Répondre

1

j'ai pu le faire avec le code suivant :

mystring = "" 
colors = %w{red white blue} 
final_list = Arrays.new{colors.size} 
final_list.each_with_index do |thing,index| 
    final_list[index] = "" 
end 
files.each do |i| 
    File.open("#{i}","r") { |f| 
     mystring = f.read 
    } 
    colors.each_with_index do |thing,index| 
     pattern = /#{thing}/i 
     if (mystring =~ pattern) 
      final_list[index] = final_list[index] + i + " " 
     end 
    end 
end 

colors.each_with_index do |thing,index| 
    list = final_list[index].split (" ") 
    puts "#{thing} (#{list.size})= #{list.join(',')}" 
end 
1
results = {} 
%w(red white blue).each do |word| 
    results[word] = Hash.new(0) 
    %w(file1.txt file2.txt file3.txt file4.txt file5.txt).each do |file| 
    scanner = StringScanner.new(File.read(file)) 
    while (scanner.scan_until(/\b#{word}\b/)) do 
     results[word][file] += 1 
    end 
    end 
end 

Cela retourne un hachage dont les clés sont les couleurs et les valeurs sont hash de fichiers et le nombre de correspondances dans chaque fichier:

{'red' => {'file1.txt' => 1, 'file2.txt' => 2}, 'blue' => {'file1.txt' => 1}} 
+0

Il peut être possible de donner l'auto-vivification 'results', de sorte que vous n'avez pas besoin de' results [word] = Hash.new (0) '. –

+0

Oui, je crois qu'il est possible de faire 'results = Hash.new (Hash.new (0))'. –