预先比较两个或多个csv文件

时间:2019-01-23 08:44:40

标签: python csv numpy validation bigdata

我只是在学习Python,众所周知,最好的方法是练习;) 现在我有一份工作,我想尝试用python来做,但是我需要一些建议。

嗯...我有几个CSV文件。结构如下:

第一个CVS     workerID,workerName,workerPhoneNumber

第2个和其他CSV包含此第一个集合的子集。

我的意思是,在第一个文件中,例如,有10,000名员工,并且在每个文件中,都有一部分是相同的员工。 例如: 在第一个文件中,我有

00001 Randal 555555
00002 Tom 66666
00003 Anthony 77775
00004 Mark 3424435
00005 Anna 3443223
00006 Monica 412415415
.....

在第二个文件中:

00001 Randal 555555
00004 Mark 3424435
00006 Monica 412415415
....

和第3个文件:

00001 Randal 555555
00004 Mark 3424435
00005 Anna 3443223
....

我必须检查所有文件中所有用户的有效性。我的意思是:比安娜检查所有文件在其他文件管理器中具有相同的ID和电话,并针对所有结果进行相同的检查(那是10万行的巨大文件)。然后,我将退回所有不匹配的内容。 另外一个问题是行中有一些“ NA”。

我刚刚完成了一个numpy教程,但是我不知道如何咬它。我什至不知道使用numpy的好习惯。所以我需要你的建议...我该如何解决这个问题?

编辑:作品具有唯一的名称:)它的随机字符串实际上不是名称:D只是示例:D在单个文件ID中也是唯一的

1 个答案:

答案 0 :(得分:1)

使用标准功能和数据结构就足够了。 让我们使用列表推导用字典列表来表示文件:

header = ('id', 'name', 'phone_number')

records_1 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file1', 'r')]
records_2 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file2', 'r')]

然后,如果要基于用户名检查记录,请使用名称为键,记录为值的字典:

records_1 = {rec['name']: rec for rec in records_1}
records_2 = {rec['name']: rec for rec in records_2}

,并检查每个名称是否有重复的ID。如果是这样,请将其保存到输出:

seen = {}
output = []
for records, others in [(records_1, records_2), (records_2, records_1)]:
    for name, rec in records:
        if name in seen:
            continue

        if rec['id'] != others['name']['id']:
            output.append((name, rec, others['name']))

请注意,我们可以使用itertools中的排列推导排列列表: https://docs.python.org/3/library/itertools.html

希望这会有所帮助!