【问题标题】:How parse the data from TXT file with tab separator?如何使用制表符分隔 TXT 文件中的数据?
【发布时间】:2011-09-26 11:34:35
【问题描述】:

我正在使用 ruby​​ 1.8.7,rails 2.3.8。我想解析由制表符分隔的 TXT 转储文件中的数据。

在这个 TXT 转储中包含一些 CSS 属性,看起来有一些无效数据。

当使用 FasterCSV gem 运行我的代码时

  FasterCSV.foreach(txt_file, :quote_char => '"',:col_sep =>'\t', :row_sep =>:auto, :headers => :first_row) do |row|
  col= row.to_s.split(/\t/)
  puts col[15]
  end

在控制台中写为“第 38 行非法引用”的错误。谁能建议我如何跳过包含无效数据的行并继续剩余行的数据加载过程?

【问题讨论】:

  • 顺便说一下,'\t'"\t" 不一样——你想使用带有转义字符的双引号。
  • 应该是"\t"(双引号),那么就不用col = row.to_s.split(/\t/)了。

标签: ruby-on-rails ruby csv fastercsv


【解决方案1】:

这是一种方法。我们进入较低级别,使用shift 解析每一行,然后静默MalformedCSVError 异常,继续下一次迭代。这个问题是循环看起来不太好。如果有人可以改进这一点,欢迎您编辑代码。

FasterCSV.open(filename, :quote_char => '"', :col_sep => "\t", :headers => true) do |csv|
  row = true
  while row
    begin
      row = csv.shift
      break unless row

      # Do things with the row here...
    rescue FasterCSV::MalformedCSVError
      next
    end
  end
end

【讨论】:

    【解决方案2】:

    只需像普通文件一样读取文件(不是使用 FasterCSV),像 \t 所知道的那样拆分它,它应该可以工作

    【讨论】:

      【解决方案3】:

      所以问题是 TSV 文件没有引号字符。规范只是简单地规定您不能在数据中使用制表符。

      CSV 库并不真正支持此用例。我通过指定一个我知道不会出现在我的数据中的引号字符来解决它。例如

      CSV.parse(txt_file, :quote_char => '☎', :col_sep => "\t" do |row|
         puts row[15] 
      end
      

      【讨论】:

        猜你喜欢
        • 2022-01-09
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 2018-06-29
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多