标准化不同格式的原始文本以在 Ruby 中创建 objects
Normalizing raw text in different formats to create objects in Ruby
我有三个文本文件,它们的信息类型完全相同,但分隔符不同。一个是CSV,一个使用spaces作为分隔符,最后一个使用|
(管道)作为分隔符。分隔符不同,但所有文件中的每一行都具有完全相同的格式。所以在pipe-delimited文件中,格式为FirstName | LastName | DOB | City | State | ZIP
(每个管道前后各有一个space)。其他两个文件使用完全相同的顺序,但使用其他分隔符。所有行都是唯一的。文件没有 headers.
我想浏览所有这些文件并为每一行创建我的 Person
object 的实例。 class 看起来像这样:
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
我想解析此数据并以最干净、最易读的方式创建 objects -- performance/scaling/etc。在这里不重要。什么方法最适合这样做?我最初的想法是以某种方式(可能使用 gsub)将所有文件转换为 CSV,然后从该数据创建一个嵌套数组,然后遍历该数组以创建 objects,但我正在寻找任何可能的 better/cleaner 个想法。
按照这些思路应该可行。如果您的城市名称中有逗号或空格,您必须小心。
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
FasterCSV
允许您指定列分隔符
FasterCSV.read(path, { :headers => false, :col_sep => "|", :skip_blanks => true })
FasterCSV.read(path, {col_sep: " ", skip_blanks: false})
我有三个文本文件,它们的信息类型完全相同,但分隔符不同。一个是CSV,一个使用spaces作为分隔符,最后一个使用|
(管道)作为分隔符。分隔符不同,但所有文件中的每一行都具有完全相同的格式。所以在pipe-delimited文件中,格式为FirstName | LastName | DOB | City | State | ZIP
(每个管道前后各有一个space)。其他两个文件使用完全相同的顺序,但使用其他分隔符。所有行都是唯一的。文件没有 headers.
我想浏览所有这些文件并为每一行创建我的 Person
object 的实例。 class 看起来像这样:
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
我想解析此数据并以最干净、最易读的方式创建 objects -- performance/scaling/etc。在这里不重要。什么方法最适合这样做?我最初的想法是以某种方式(可能使用 gsub)将所有文件转换为 CSV,然后从该数据创建一个嵌套数组,然后遍历该数组以创建 objects,但我正在寻找任何可能的 better/cleaner 个想法。
按照这些思路应该可行。如果您的城市名称中有逗号或空格,您必须小心。
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
FasterCSV
允许您指定列分隔符
FasterCSV.read(path, { :headers => false, :col_sep => "|", :skip_blanks => true })
FasterCSV.read(path, {col_sep: " ", skip_blanks: false})