Как записать заголовок столбца в файл 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

Код добавляет заголовки столбцов к каждой строке, и мне это нужно только в верхней части каждого столбца данных. Я искал здесь и в других местах, но не могу найти четкого ответа на то, как это делается. Любая помощь будет принята с благодарностью.


person Joe    schedule 09.04.2013    source источник


Ответы (3)


Вместо этого я бы рекомендовал использовать 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
  }
}
person knut    schedule 09.04.2013

Самый чистый способ сделать это — открыть файл один раз в режиме '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
person sfstewman    schedule 09.04.2013

Лучший способ обработки 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
person Asad Ali    schedule 12.01.2016
comment
Как бы я изменил исходные заголовки после вставки некоторых данных? Скажем, у меня могут быть дополнительные столбцы, но я узнаю об этом только после того, как данные будут заполнены? Я пробовал csv.headers.push, но не обновлял фактические заголовки в выводимом файле. Спасибо - person scanales; 06.04.2016
comment
Предполагая, что вы только добавляете столбцы вправо, вы можете открыть файл с другим фрагментом кода/перемотать, чтобы перезаписать первую строку. - person whodini9; 27.07.2018