2017-01-25 2 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

Зачем мне нужно преобразовать его в строку, я думал, что он уже читается как один. Каким будет лучший способ подсчета столбца вместо строки? В конце концов заголовок будет удален, так как он будет загружаться в logstash – Pokecallum

+1

'IO.write ('my_test.csv', table)' должен работать. – Stefan

Смежные вопросы