规范化不同格式的原始文本以在Ruby

时间:2015-08-01 00:52:18

标签: ruby parsing csv normalization

我有三个文本文件,它们具有完全相同的信息类型,但具有不同的分隔符。一个是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),然后从这些数据中创建一个嵌套数组,然后迭代数组以创建对象,但我正在寻找任何可能更好/更清洁的想法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

FasterCSV允许您指定列分隔符

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

FasterCSV.read(path, {col_sep: " ", skip_blanks: false})