我正在完成一项任务,但无法弄明白。我们必须首先解析文本文件,然后将结果提供给哈希。我这样做了:
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的变量 阅读各行 将线条分成每个字符。 我知道这个有用,我可以把字符放到屏幕上。 现在我需要将字符输入哈希值,但它不起作用。我正在努力学习语法(至少)和基本概念(最多)。我只想要文件中的字母字符,而不是标点符号等。
非常感谢任何帮助。
感谢。
答案 0 :(得分:3)
我会直接做:
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
....
答案 1 :(得分:1)
尝试使用Enumerable类方法:
open("file").each_char.grep(/\w/).group_by { |char|
char
}.each { [ |char,num|
p [char, num.count]
}
(grep方法过滤器使用正则表达式" \ w"(任何字符,数字ou下划线);您可以更改为[A-Za-z]以仅过滤字母表。)
答案 2 :(得分:0)
我认为问题在于:
char_count.has_key?('ch')
char_count['ch'] +=1
end
您没有使用变量而是使用字符串'ch'
,在ch
的两个位置都更改了该字符。
此外,可以使用范围创建哈希,例如:
char_count = {}
('a'..'z').each{|l| char_count[l] = 0}
或:
char_count = ('a'..'z').inject({}){|hash,l| hash[l] = 0 ; hash}