如何从文本文件中读取字符,然后将它们存储在Ruby中的哈希中

时间:2011-10-04 15:03:37

标签: 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的变量 阅读各行 将线条分成每个字符。 我知道这个有用,我可以把字符放到屏幕上。 现在我需要将字符输入哈希值,但它不起作用。我正在努力学习语法(至少)和基本概念(最多)。我只想要文件中的字母字符,而不是标点符号等。

非常感谢任何帮助。

感谢。

3 个答案:

答案 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}