Как прочитать символы из текстового файла, а затем сохранить их в хэш в Ruby

#ruby

#ruby

Вопрос:

Я работаю над заданием и не могу понять это. Мы должны сначала проанализировать текстовый файл, а затем передать результаты в хэш. Я сделал это:

     code = File.open(WORKING_DIR   '/code.txt','r')
    char_count = {'a' => 0,'b' => 0,'c' => 0,'d' => 0,'e' => 0,'f' => 0,'g' => 0,'h' => 0,'i' => 0,
                   'j' => 0,'k' => 0,'l' => 0,'m' => 0,'n' => 0,'o' => 0,'p' => 0,'q' => 0,'r' => 0,
                   's' => 0,'t' => 0,'u' => 0,'v' => 0,'w' => 0,'x' => 0,'y' => 0,'z' => 0
                   }
# Step through each line in the file.
code.readlines.each do |line|

    # Print each character of this particular line.
    line.split('').each do
        |ch| 
            char_count.has_key?('ch')
                char_count['ch']  =1        
           end
  

Мой ход мыслей: откройте файл с переменной с именем code
, прочитайте отдельные строки
, разбейте строки на каждый символ.
Я знаю, что это работает, я могу выводить символы на экран.
Теперь мне нужно ввести символы в хэш, и это не работает. Я борюсь с синтаксисом (по крайней мере) и базовыми понятиями (максимум). Мне нужны только символы алфавита, а не знаки препинания и т. Д. Из файла.

Любая помощь будет с благодарностью.

Спасибо.

Комментарии:

1. Pst … если вы открываете такой файл, вам лучше закрыть его.

Ответ №1:

Я бы сделал напрямую :

 File.open(WORKING_DIR   '/code.txt','r') do |f|
   char_count = Hash.new(0) # create a hash where 0 is the default value
   f.each_char do |c| # iterate on each character
      ... # some filter on the character you want to reject.
      char_count[c]  =1
   end
end
  

PS: вы написали 'ch' строку вместо ch имени переменной

РЕДАКТИРОВАТЬ: фильтр может быть

 f.each_char do |c| # iterate on each character
   next if c ~= /W # exclude with a regexp non word character
   ....
  

Ответ №2:

Попробуйте это, используя перечислимые методы класса:

     open("file").each_char.grep(/w/).group_by { |char| 
        char 
    }.each { |char,num| 
        p [char, num.count] 
    }
  

(Фильтр метода grep использует регулярное выражение «w» (любой символ, цифра или подчеркивание); вы можете изменить на [A-Za-z] для фильтрации только алфавитов.)

Комментарии:

1. Спасибо, Карлос, ценю это. Я вообще больше не использую Ruby, но большой 1 за ответ на то, что так скрыто! Ты потрясающий!

Ответ №3:

Я думаю, что проблема здесь:

 char_count.has_key?('ch')
  char_count['ch']  =1        
end
  

Вы используете не переменную, а строку 'ch' , измените это в обоих местах для ch .

Также хэш может быть создан с использованием range, например:

 char_count = {}
('a'..'z').each{|l| char_count[l] = 0}
  

или:

 char_count = ('a'..'z').inject({}){|hash,l| hash[l] = 0 ; hash}