2017-01-25 15 views
0

私がやりたいことは、各行に何個の@があるかを数え、最後にこの値を合計フィールドに入れることです。すべての行をカウントし、CSVの各行の末尾に追加する

これは、作品の種類を意味しますが、それはそれがカウントする最後の行の値を追加するだけです。

マイCSV

Header,Header,Header 
[email protected],Info,Info 
Info,[email protected]@,Info 
Info,Info,[email protected]@@ 

マイコード

require "csv" 
table = CSV.read("my_test.csv", { 
    headers: true, 
    col_sep: "," 
}) 

File.readlines('my_test.csv').each do |line| 
    table.each do |row| 
    at_count = line.count('@') 
    row["Total"] = at_count 
    end 
end 

CSV.open("my_test.csv", "w") do |f| 
    f << table.headers 
    table.each { | row | f << row } 
end 

現在の結果

Header,Header,Header,Total 
[email protected],Info,Info,3 
Info,[email protected]@,Info,3 
Info,Info,[email protected]@@,3 
+1

Rubyでは、ハッシュが最後の引数である場合、ハッシュに '{}} 'のカッコを省略することができます。コード内の混乱の量を減らします。 – tadman

答えて

1

あなたはFile.readlinesは必要ありません。 CSVはすでにそれを読んでいます。

require "csv" 
table = CSV.read("test.csv", { headers: true}) #just shorter 

table.each do |row | #no readlines 
    at_count = row.to_s.count('@') # note the to_s 
    row["Total"] = at_count 
end 


CSV.open("my_test.csv", "w") do |f | 
    f << table.headers 
    table.each { | row | f << row} 
end 
+0

新しい列を導入するときに手動でヘッダーを更新する必要はありますか? – tadman

+0

なぜそれを文字列に変換する必要があるのですか?私はそれが既に1つとして読み込まれていると思いました。行ではなく列を数える最善の方法は何でしょうか?最終的には、すべてがlogstash – Pokecallum

+1

'IO.write( 'my_test.csv'、table)'に供給されるので、ヘッダーが削除されます。 – Stefan

関連する問題