在与中间部分比较之后,我选择正确的部分进行清理并保存,如果相等则
> #!/usr/bin/env ruby
require 'rubygems'
require 'levenshtein'
require 'csv'
# Extending String class for blank? method
class String
def blank?
self.strip.empty?
end
end
# In
lines = CSV.read('entrada.csv')
lines.each do |line|
id = line[0].upcase.strip
left = line[1].upcase.strip
right = line[2].upcase.strip
eduardo = line[2].upcase.split(' ','de')
line[0] = id
line[1] = left
line[2] = right
line[4] = eduardo[0]+eduardo[1]
distance = Levenshtein.distance left, right
line << 99 if (left.blank? or right.blank?)
line << distance unless (left.blank? or right.blank?)
end
# Out
# counter = 0
CSV.open('salida.csv', 'w') do |csv|
lines.each do |line|
# counter = counter + 1 if line[3] <= 3
csv << line
end
end
# p counter
中间是正确的,我应该纠正
一些例子:
Eduardo | Abner | Herrera | Herrera - &gt; Eduardo Herrera
天使|德|莱昂 - &gt; Angel De Leon
答案 0 :(得分:0)
第一项业务是提出一些规则。根据您的示例和Spanish naming customs,这是我的规则。
de
,y
或e
链接的多个单词。因此['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']
应为{ forename: 'Marquilla', paternal_surname: 'Gutierrez', maternal_surname: 'Petronilda de Leon' }
为简化流程,我首先将任何复合姓氏加入一个字段。 ['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']
变为['Marquilla', 'Gutierrez', 'Petronilda De Leon']
。请注意['Angel', 'De', 'Leon']
之类的案例,在这种情况下,姓氏可能是De Leon
。
一旦完成,找出哪个部分变得更容易。
name = {}
if parts.length == 1
error?
# The special case of only two parts: forename paternal_surname
elsif parts.length == 2
name = {
forename: parts[0],
paternal_surname: parts[1]
}
# forename paternal_surname maternal_surname
else
# The forename can have multiple parts, so work from the
# end and whatever's left is their forename.
name[:maternal_surname] = parts.pop
name[:paternal_surname] = parts.pop
name[:forename] = parts.join(" ")
end
西班牙语命名中存在很多含糊不清的内容,因此这只能是对其实际名称的有根据的猜测。在了解有关数据集的更多信息时,您可能需要调整规则。例如,我非常确定de
的处理并不那么简单。例如......
与PedroPérezMontilla结婚的一个LeocadiaBlancoÁlvarez可能会被称为Leocadia BlancodePérez或LeocadiaBlancoÁlvarezdePérez
在这种情况下,['Marquilla', 'Gutierrez', 'Petronilda', 'De', 'Leon']
变为['Marquilla', 'Gutierrez', 'Petronilda', 'De Leon']
,{ forename: 'Marquilla', paternal_surname: 'Gutierrez', maternal_surname: 'Petronilda', married_to: 'Leon' }
或'Marquilla Gutierrez Petronilda
与父母姓氏为Leon
的人结婚。
答案 1 :(得分:-1)
我会在数据库中添加更多列,例如last_name1
,last_name2
,last_name3
等,并使它们成为可选项(不要对这些属性进行验证)。希望能回答你的问题!