开发者

How to read characters from a text file, then store them into a hash in Ruby

I am working on an assignment, and can't figure it out. We have to first parse a text file, and then feed the results into a hash. I have done this:

    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

My line of thinking: open the file to a variable named code read the individual lines break the lines into each character. I know this works, I can puts out the characters to screen. Now I need to feed the characters into the hash, and it isn't working. I am struggl开发者_运维百科ing with the syntax (at least) and basic concepts (at most). I only want the alphabet characters, not the punctuation, etc. from the file.

Any help would be greatly appreciated.

Thanks.


I would directly do :

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 : you wrote 'ch' the string instead of ch the variable name

EDIT : the filter could be

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


Try this, using Enumerable class methods:

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

(The grep method filter is using regex "\w" (any character, digit ou underscore); you can change to [A-Za-z] for filter only alphabets.)


I think the problem is here:

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

You're not using the variable but a string 'ch', change that in both places for ch.

Also the hash could be created using range, for example:

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

or:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜