【问题标题】:Normalizing raw text in different formats to create objects in Ruby规范化不同格式的原始文本以在 Ruby 中创建对象
【发布时间】:2015-10-23 18:44:23
【问题描述】:

我有三个文本文件,它们的信息类型完全相同,但分隔符不同。一个是CSV,一个使用空格作为分隔符,最后一个使用|(管道)作为分隔符。分隔符不同,但所有文件中的每一行都具有完全相同的格式。所以在管道分隔的文件中,格式为FirstName | LastName | DOB | City | State | ZIP(每个管道前后都有一个空格)。其他两个文件使用完全相同的顺序,但使用了其他分隔符。所有行都是唯一的。这些文件没有标题。

我想浏览所有这些文件并为每一行创建我的Person 对象的实例。该类如下所示:

class Person
  attr_reader :first_name, :last_name, :d_o_b, :city, :state, :zip

  def initialize(first_name, last_name, ...)
    @first_name = first_name
    @last_name = last_name
    ...
  end

  ...

  etc.

end

我想解析这些数据并以最简洁、最易读的方式创建对象——性能/缩放/等等。在这里不重要。什么方法最适合这样做?我最初的想法是以某种方式将所有文件转换为 CSV(可能使用 gsub),然后从这些数据中创建一个嵌套数组,然后遍历数组以创建对象,但我正在寻找任何可能的更好/更清洁想法。

【问题讨论】:

    标签: ruby parsing csv normalization


    【解决方案1】:

    FasterCSV 允许您指定列分隔符

    FasterCSV.read(path, { :headers => false, :col_sep => "|", :skip_blanks => true })
    
    FasterCSV.read(path, {col_sep: " ", skip_blanks: false})
    

    【讨论】:

      【解决方案2】:

      这些方面的东西应该可以工作。如果您的城市名称包含逗号或空格,则必须小心。

      files = ['file1.txt', 'file2.txt']
      
      people = []
      files.each do |f|
        File.open(f).each do |line|
      
          # Split line along any of the delimeters
          args = line.strip.split(/[ ,\|]+/)
      
          # The * (splat) unpacks the array into an argument list
          people << Person.new(*args)
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 1970-01-01
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多