在Ruby中parsing制表符分隔文件的最好方法是什么?
在Ruby中parsing制表符分隔文件的最好(最有效的)方法是什么?
Ruby CSV库允许您指定字段分隔符。 Ruby 1.9使用FasterCSV 。 像这样的东西可以工作:
require "csv" parsed_file = CSV.read("path-to-file.csv", { :col_sep => "\t" })
TSV的规则实际上与CSV有点不同。 主要的区别在于,CSV规定在字段中粘贴逗号,然后在字段中使用引号字符和转义引号。 我写了一个简单的例子来展示简单的响应失败:
require 'csv' line = 'boogie\ttime\tis "now"' begin line = CSV.parse_line(line, col_sep: "\t") puts "parsed correctly" rescue CSV::MalformedCSVError puts "failed to parse line" end begin line = CSV.parse_line(line, col_sep: "\t", quote_char: "Ƃ") puts "parsed correctly with random quote char" rescue CSV::MalformedCSVError puts "failed to parse line with random quote char" end #Output: # failed to parse line # parsed correctly with random quote char
如果你想使用CSV库,你可以使用一个随机的引用字符,你不希望看到你的文件(这个例子显示了这个),但你也可以使用一个更简单的方法,如下面显示的StrictTsv类来获得同样的效果,而不必担心现场报价。
# The main parse method is mostly borrowed from a tweet by @JEG2 class StrictTsv attr_reader :filepath def initialize(filepath) @filepath = filepath end def parse open(filepath) do |f| headers = f.gets.strip.split("\t") f.each do |line| fields = Hash[headers.zip(line.split("\t"))] yield fields end end end end # Example Usage tsv = Vendor::StrictTsv.new("your_file.tsv") tsv.parse do |row| puts row['named field'] end
使用CSV库或更严格的select取决于谁向您发送文件,以及他们是否期望遵守严格的TSV标准。
有关TSV标准的详细信息可以在http://en.wikipedia.org/wiki/Tab-separated_valuesfind