【问题标题】:How to write columns header to a csv file with Ruby?如何使用 Ruby 将列标题写入 csv 文件?
【发布时间】:2013-04-01 02:55:31
【问题描述】:

我在使用 Ruby 将列写入 csv 文件时遇到问题。下面是我的sn-p代码。

 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

代码将列标题添加到每一行,我只需要它在每列数据的顶部。我已经在这里和其他地方搜索过,但找不到一个明确的答案来说明它是如何完成的。 任何帮助将不胜感激。

【问题讨论】:

    标签: ruby ruby-on-rails-3 csv fastercsv


    【解决方案1】:

    处理 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
    

    【讨论】:

    • 插入一些数据后如何更改原始标题?假设我可能有其他列,但只有在填充数据后才知道?我试过 csv.headers.push 但没有更新它输出的文件中的实际标题。谢谢
    • 假设您只是将列一直附加到右侧,您可以使用不同的 sn-p 代码打开文件/倒带以覆盖第一行。
    【解决方案2】:

    我建议改用 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
      }
    }
    

    【讨论】:

      【解决方案3】:

      最干净的方法是打开文件一次,在模式'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
      

      【讨论】:

        猜你喜欢
        • 2018-03-21
        • 2021-12-29
        • 1970-01-01
        • 2019-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多