【问题标题】:Headers on the second row in FasterCSV?FasterCSV 中第二行的标题?
【发布时间】:2011-02-24 12:17:14
【问题描述】:

G'day 伙计们,我目前正在使用 fasterCSV 来解析 ruby​​ 中的 CSV 文件,并且想知道如何摆脱 CSV 上的初始数据行(初始行包含另一个生成的时间/日期信息软件包)

我尝试使用 fasterCSV.table 然后删除 row(0) 然后将其转换为 CSV 文档然后解析它

但该行仍然存在于文档中。

还有其他想法吗?

fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)

【问题讨论】:

    标签: ruby-on-rails ruby csv fastercsv


    【解决方案1】:

    三个建议


    你能让 FasterCSV 忽略这条线吗?

    您可以使用 :return_headers => true 选项跳过坏行。如果第二行不是真正的标题,那会很好用。更多信息请见here

    :return_headers:

    当为 false 时,标题行是静默的 吞下。如果设置为 true,则标题行 在 FasterCSV::Row 中返回 具有相同标题的对象和 字段(保存字段不去 通过转换器)。


    用其他工具剪断线

    您不需要为此使用 Ruby - 如何使用建议的解决方案之一来剪切文件 here 您可以使用系统方法从 Ruby 调用单线。


    最大灵活性 - 使用 FasterCSV 逐行解析文件

    您是否考虑过直接读取文件,跳过第一行然后接受或拒绝行?我的代码的核心是这种解析方法,它将文件视为一系列行,接受或拒绝每一行。您可以执行类似的操作,但跳过第一行。

    巧妙的是,您可以通过定义自己的可接受行来确定哪些行是可接受的?方法 - 仅将有效的 CSV 数据传递给可接受的?其余的都被丢弃以响应异常。

          def parse(file)
                #
                # Parse data
                #
                row = []
    
                file.each_line do |line|
    
                    the_line = line.chomp
    
                    begin
    
                        row = FasterCSV.parse_line(the_line)
    
                        ok, message = acceptable?(row)
    
    
                        if not ok
                            reject(file.lineno, the_line, message)
                        else
                            accept(row, the_line)
                        end
    
                    rescue FasterCSV::MalformedCSVError => e
                        reject(file.lineno, the_line, e.to_s)
                    end
    
                end
    

    【讨论】:

      【解决方案2】:

      您好,我们利用澳大利亚选举委员会的一些数据来做到这一点。有问题的文件在第一行有日期字符串,在第二行有标题

      require 'csv'
      require 'open-uri'
      
      filename = "http://results.aec.gov.au/15508/Website/Downloads/SenateGroupVotingTicketsDownload-15508.csv"
      file = File.open(open(filename))
      first_line = file.readline
      CSV.parse(file, headers: true).each do |row|
        puts row["State"]
      end
      

      我认为我引用的文件仍然存在,但可以用相关文件替换。如果你需要跳过更多的行,你必须调用 file.readline 的次数。

      【讨论】:

      • 谢谢。我有一个类似排列的文件。
      【解决方案3】:

      根据文档,fTable = FasterCSV.table("sto.csv", :return_headers => false) 应该做你想做的事。 .table 暗示 :headers => true The docs 有这个信息。

      【讨论】:

      • 第一行不是标题。第一行是“另一个应用程序生成的时间/日期信息”
      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      相关资源
      最近更新 更多