如何纠正丢失的单元格/缺less分隔符导致“移位”的数据在一组列?

我有每行分号分离制造商的产品和供应商的数据缺失细胞。 电子表格中的每个制造商产品都有多个供应商。

数据的顺序将始终是相同的列:

vendor_name_1, vendor_address_1, vendor_phone_1, vendor_fax_1, vendor_contact_mobile_1, vendor_contact_email_1, etc. 

如果该产品有多个供应商(几乎所有的供应商都是大多数供应商),则从左到右依次按相同的顺序重复列:

 vendor_name_2, vendor_address_2, vendor_phone_2, vendor_fax_2, vendor_contact_mobile_2, vendor_contact_email_2, etc. 

此时,只要该行上的产品有更多供应商,就会重复这些列。

一个“好”的行将在正确的列中包含所有可用的数据:

 Motion Distributors; 3231 Apex Drive; Dulles, Ohio 45321; (321) 542-6422(p); (321) 542-6428(f); (321) 542-6680(m); alan@motiondist.com; etc. etc. 

一个“坏”的行将有一个或多个缺less的行至less有一个供应商,这当然会影响到所有缺失的单元格的权利,所以一切都被转移。

由于单元格中的某些数据丢失,所以问题是将每行中的数据返回到正确的单元格。

例如,如果vendor_fax号码丢失,那么缺less的单元格右侧的所有单元格都不会进入正确的列并被移位。

更糟糕的是,由于同一产品有多个供应商,每行丢失的单元越多,该行就越多。

有没有办法解决这个问题,因为每个列集具有相同的安排,只有额外的分隔符丢失?

我希望至less对于公司和联系人姓名以及每个列types(姓名,电话号码,电子邮件等)的通用匹配的电话号码是否有修正?

有没有办法按每行处理电子表格以确保匹配发生? 如有必要,我可以将单元格拆分成其他列,如果它允许更具体的匹配。

我非常渴望去解决问题所需的任何语言或实用程序。

我在这里search了几个类别,并没有看到一种方法来解决这个(但)…

假设电话号码等格式是可以预测的,并且容易辨别(例如,电话和传真之间的差异是显而易见的),那么应该很容易地猜测电话号码匹配的方式。 我会创build一个正则expression式的哈希值:

 field_regexes = { name: \^.+$\, street: \^d+\s\, city: \^.*,\s\d{5}$\, phone: \^\(\d{3}\)\s\d{3}\-\d{4}\(p\)$\, fax: \^\(\d{3}\)\s\d{3}\-\d{4}\(f\)$\, mobile: \^\(\d{3}\)\s\d{3}\-\d{4}\(m\)$\, email: \^\w+\@\w+.\w+$\, etc... } 

代码可能是这样的:

 fields = input.split(';').map(&:strip) while fields.present? do record = parse_record(fields) break unless record.present? # something went wrong save(record) end def parse_record(fields) result = {} field_regexes.each do |name, regex| do if fields[0] =~ regex result[name] = fields.unshift break if fields.empty? end end result end 

注意:这里假定没有冒号应该被认为是有效的数据(例如地址或公司名称中的冒号)

理想的解决scheme是让谁发送给你这个数据甚至是空白列的分隔符,然后所有的列将排队在没有问题的导入。 假设让您的input固定不是一个选项…

我认为您需要逐列确定每个input栏中的数据

电子邮件地址很容易 – 有一个@和一个. 在他们或他们无效。 如果您发现错误的地方,请右移,直到它位于电子邮件栏中。

缺less电话号码也很容易。 由于他们似乎有(p)(f)(m)来识别号码types,只需拖动最后三个字符即可确定您拥有的号码。 如果缺less一个,则将剩下的部分向右移动,直到所拥有的部分位于正确的列中。

识别一个邮政编码是非常简单的,它可以是5 02134或9位数字021345678或者可能是10个字符02134-5678 。 向右移动直到排列。

如果州政府有明确的说法,请列出所有州的表格,如果您比预期的时间早find匹配的地方,则直接向右移动,直到州政府处于正确的位置。 如果州是标准的2个字符的邮政缩写,只要找一个2字符的列,并右移,直到它匹配。

美国街道地址应该以房屋(或build筑物)号码开始,所以以数字开头的string应该是一个地址,但可能是一个邮政编码(zip + 4,带有embedded的短划线- ),所以如果是所有数字(可能包括破折号),那么这是拉链字段,否则它是一个地址字段。

这个城市……这是一个全部的阿尔法领域,应该是所有剩下的东西之后剩下的东西。

公司名称 – 所有这些假定公司名称实际上是在那里开始logging,如果没有,你可能会有点失败,但我相信有一些方法可以确定有什么。

你可能想尝试像状态机一样。 我现在正处在这个logging中,所以接下来我将会看到,下面我们来看下一列数据,看看实际存在的情况,然后向右移动直到看起来排队。 这应该最大限度地减less公司名称或城市名称错误识别的错误。

你应该可以用你select的语言来写,但是这可能不是世界上最快的事情,因为它一次只能进行一个领域的研究。