Как написать заголовок столбца в файл csv с Ruby?
У меня возникли проблемы с записью столбцов в файл csv с Ruby. Ниже приведен фрагмент кода.
calc = numerator/denominator.to_f
data_out = "#{numerator}, #{denominator}, #{calc}"
File.open('cdhu3_X.csv','a+') do|hdr|
hdr << ["numerator","denominator","calculation\n"] #< column header
hdr << "#{data_out}\n"
end
Код добавляет заголовки столбцов к каждой строке, и мне нужен только он в верхней части каждого столбца данных. Я искал здесь и в других местах, но не могу найти четкого ответа на то, как это делается.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Я бы рекомендовал вместо этого использовать CSV-библиотеку:
require 'csv'
CSV.open('test.csv','w',
:write_headers=> true,
:headers => ["numerator","denominator","calculation"] #< column header
) do|hdr|
1.upto(12){|numerator|
1.upto(12){ |denominator|
data_out = [numerator, denominator, numerator/denominator.to_f]
hdr << data_out
}
}
end
Если вы не можете использовать параметр w
, и вам действительно нужен a+
(например, данные недоступны сразу), вы можете попробовать следующий трюк:
require 'csv'
column_header = ["numerator","denominator","calculation"]
1.upto(12){|numerator|
1.upto(12){ |denominator|
CSV.open('test.csv','a+',
:write_headers=> true,
:headers => column_header
) do|hdr|
column_header = nil #No header after first insertion
data_out = [numerator, denominator, numerator/denominator.to_f]
hdr << data_out
end
}
}
Ответ 2
Самый чистый способ сделать это - открыть файл один раз, в режиме 'w'
, записать заголовки, а затем записать данные.
Если есть какая-то техническая причина, которая не может этого сделать (например, данные недоступны сразу), вы можете использовать IO#tell
в файле, чтобы вернуть текущую позицию файла. Когда вы открываете файл для добавления, позиция устанавливается в конец файла, поэтому, если текущая позиция файла равна нулю, тогда файл был вновь создан и не имеет заголовков:
File.open('cdhu3_X.csv', 'a+') do |hdr|
if hdr.tell() == 0 # file is empty, so write header
hdr << "numerator, denominator, calculation\n"
end
hdr << "#{data_out}\n"
end
Ответ 3
Лучший способ обработки csv файла - использовать модуль Ruby CSV
.
У меня была такая же проблема после чтения кода CSV
, на который я столкнулся с этим решением, которое я считаю наиболее эффективным.
headers = ['col1','col2','col3']
CSV.open(file_path, 'a+', {force_quotes: true}) do |csv|
csv << headers if csv.count.eql? 0 # csv.count method gives number of lines in file if zero insert headers
end