#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}