给出如下项目列表(用制表符分隔的列):
我要确定哪一个是MSISDN(10位数字)、姓名、地址、日期和性别。在
我很确定这是不可能做到100%正确/准确的,因为缺乏比较点,而且经常丢失数据。在
所以我是这么做的:
一行一行地浏览列表。然后每行按制表符(\t)拆分,成为一个列表。 然后在for循环中测试列表中的每个项目:
for item in csv_cols:
if reg_msisdn.match(item):
s_msisdn = item
if item.lower() in list_male or item.lower() in list_female:
s_gender = item
if parse(item):
s_birthdate = item
if any(ext in item.lower() for ext in list_place) or any(ext in item.lower() for ext in list_ad):
s_address = item
else:
s_name = item
s_all = s_msisdn + "^" + s_name + "^" + s_address + "^" + s_birthdate + "^" + s_gender
编辑:我在每一个s_(value) = item
之后添加了一个csv_cols.remove(item)
,这样测试的项目已经被删除了-它没有改变任何东西。在
s_(value)
都以NULL
作为文本开始s_msisdn
。在s_gender
。在s_address
。在s_birthdate
。在s_name
。在我很肯定我的逻辑会有明显的漏洞,但我真的想不出其他办法来做。在
也就是说,即使使用这种分散式的逻辑,我也遇到了一些问题,特别是上面的第5项,它返回以下错误毫无帮助:
signed integer is greater than maximum
我知道这一点是因为把它从循环中去掉,剩下的代码就可以工作了。在
我能帮忙吗?在
谢谢。在
注:我用的是Mac/UNIX。在
几乎不可能在所有情况下区分姓名和地址(是姓名还是地址?)。最好的方法是假设名称总是出现在地址之前,否则您将面临各种复杂的查找。在
我会逐行处理数据,首先将行转换为如下列表:
现在我要定义一组函数来决定每个条目代表什么。确定MSISDN编号、性别和日期应该相对简单。在
要确定行中的某个条目是否是10位的MSISDN编号:
^{pr2}$要确定行中的条目是否表示性别:
要确定行中的条目是否代表日期:
现在使用这些函数来构建另一个解析行条目的函数:
例如:
它试图将msisdn解析为日期,这会引发异常而不是返回false,这就是parse(…):无法工作的原因。使用类似的东西
(如果不是ValueError,那么检查抛出的异常类型并使用它)
试试这个:
您可能需要调整测试顺序。这个想法是,一旦一个项目匹配,其他测试就不适用了。这也会提高速度。在
相关问题 更多 >
编程相关推荐