如何用Ruby将列标头写入csv文件?

时间:2021-11-08 23:24:25

I am having trouble writing columns to a csv file with Ruby. Below is my snippet of code.

我在用Ruby写csv文件时遇到了麻烦。下面是我的代码片段。

 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

The code adds the column headers to every line and I only need it at the top of each column of data. I have searched here and other places but can't find a clear answer to how its done. Any help would be greatly appreciated.

代码将列标头添加到每一行,我只需要它位于每一列数据的顶部。我在这里和其他地方搜索过,但找不到一个明确的答案。如有任何帮助,我们将不胜感激。

3 个解决方案

#1


41  

I would recommend to use the CSV-library instead:

我建议使用CSV-library:

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

If you can't use the w option and you really need the a+ (e.g., the data isn't available all at once), then you could try the following trick:

如果你不能使用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


6  

The cleanest way to do this is to open the file once, in mode 'w', write the headers, and then write the data.

最干净的方法是在模式w中打开文件一次,编写头文件,然后编写数据。

If there's some technical reason that can't do this (e.g., the data isn't available all at once), then you can use the IO#tell method on the file to return the current file position. When you open the file for appending, the position is set to the end of the file, so if the current file position is zero, then the file was newly created and has no headers:

如果有技术原因不能这样做(例如,数据不能一次全部可用),那么可以使用文件上的IO#tell方法返回当前文件位置。当你打开文件追加时,位置被设置为文件的末尾,所以如果当前文件的位置是0,那么文件是新创建的,没有头文件:

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


2  

Best way to handle csv file is to use Ruby's CSV module.

处理csv文件的最佳方法是使用Ruby的csv模块。

I had same problem after reading CSV code I came across this solution which i find most efficient.

我在阅读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

#1


41  

I would recommend to use the CSV-library instead:

我建议使用CSV-library:

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

If you can't use the w option and you really need the a+ (e.g., the data isn't available all at once), then you could try the following trick:

如果你不能使用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


6  

The cleanest way to do this is to open the file once, in mode 'w', write the headers, and then write the data.

最干净的方法是在模式w中打开文件一次,编写头文件,然后编写数据。

If there's some technical reason that can't do this (e.g., the data isn't available all at once), then you can use the IO#tell method on the file to return the current file position. When you open the file for appending, the position is set to the end of the file, so if the current file position is zero, then the file was newly created and has no headers:

如果有技术原因不能这样做(例如,数据不能一次全部可用),那么可以使用文件上的IO#tell方法返回当前文件位置。当你打开文件追加时,位置被设置为文件的末尾,所以如果当前文件的位置是0,那么文件是新创建的,没有头文件:

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


2  

Best way to handle csv file is to use Ruby's CSV module.

处理csv文件的最佳方法是使用Ruby的csv模块。

I had same problem after reading CSV code I came across this solution which i find most efficient.

我在阅读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