2011-01-10 12 views
3

私は2つのことについて助けを求めています。 1)Rubyが文字列をHTMLでラップする方法を探しています。テキストファイルの単語のハッシュを生成するプログラムを作成していますが、結果をSTDOUTに出力するのではなくHTMLファイルに配置したいと考えています。私は、各文字列をreadlines()や何かを使ってHTML段落タグにラップする必要があると思っていますが、それは分かりません。次に、HTMLで文字列をラップしたら2)空のHTMLファイルに書きたい。HTMLタグでRuby文字列を折り返す方法

35, the 
27, of 
20, to 
16, in 
# . . . 

を私はラップHTMLファイルにエクスポートしたいと思います:私たちは、このを通じてテキストファイルを実行し、受信したのであれば

filename = File.new(ARGV[0]).read().downcase().scan(/[\w']+/) 
frequency = Hash.new(0) 
words.each { |word| frequency[word] +=1 } 
frequency.sort_by { |x,y| y }.reverse().each{ |w,f| puts "#{f}, #{w}" } 

今の私のプログラムは次のようになります次のような行:

<p>35, the</p> 
<p>27, of</p> 
<p>20, to</p> 
<p>16, in</p> 
# . . . 

事前にお答えいただきありがとうございます。このような

+0

あなたは本当に引数のないメソッド呼び出しの後に括弧を必要としない...私は知っている –

+1

@Jacobは、私はそれらを含めて、それらを取り除くの間で前後に続けます。いくつかの点で私は可読性のためにそこに置くのが好きです(例えば、私は何がメソッドであり、何が変数であるかをすぐに見ることができます)が、プログラムを乱雑にする心配もあります。 –

+0

通常、任意の種類の頻度カウントを出力すると、カウントが複数の要素で同じになるケースが発生します。同じ数の単語については、何をしたいですか?表示される順番に並べ替えたり、昇順または降順に並べ替えたりできますか? –

答えて

3

これは些細な問題です。

#open file, write, and close 

File.open('words.html', 'w') do |ostream| 
    words = File.new(ARGV[0]).read.downcase.scan(/[\w']+/) 
    frequency = Hash.new 
    words.each { |word| frequency[word] +=1 } 

    frequency.sort_by {|x, y| y }.reverse.each do |w,f| 
    ostream.write "<p>#{f}, #{w}</p>" 
    end 
end 
2

何か:

File.open("output.html", "w") do |output| 

    words = File.new(ARGV[0]).read().downcase().scan(/[\w']+/) 
    frequency = Hash.new(0) 
    words.each { |word| frequency[word] +=1 } 
    frequency.sort_by { |x,y| y }.reverse().each do |w,f| 
    output.write "<p>#{f}, #{w}</p>\n" 
    end 

end 
+1

ありがとう!それがトリックでした。 –

1

私が開発したdom gemを調べるとよいでしょう。あなたの文字列は次のように生成することができます。

require "dom" 

frequency.sort_by(&:last).reverse.map{|w, f| "#{f}, #{w}".dom(:p)}.dom 
# => "<p>35, the</p><p>27, of</p><p>20, to</p><p>16, in</p>" 
関連する問題