【发布时间】:2015-12-23 20:20:12
【问题描述】:
可能有很多方法可以解决这个问题,但归根结底是要点:
我有两个人满为患的数据库,都导出为 csv 文件。其中一个数据库正在退役。 我需要比较每个 csv 文件(或两者的组合版本),并在即将退役的服务器中过滤掉所有非唯一的人。这样我就可以将唯一的人从退役的数据库导入到当前的数据库中。
我只需要比较 FirstName 和 LastName(它们是两个单独的列)。部分问题在于它们不是精确重复的,名称在一个数据库中全部大写,而在另一个数据库中则大写。
这是我将两个 csv 文件合并为一个时的数据示例。所有 CAPS 名称均来自当前数据库(这是 csv 当前的格式):
FirstName,LastName,id,id2,id3
John,Doe,123,432,645
Jacob,Smith,456,372,383
Susy,Saucy,9999,12,8r83
Contractor ,#1,8dh,28j,153s
Testing2,Contrator,7463,99999,0283
JOHN,DOE,999,888,999
SUSY,SAUCY,8373,08j,9023
将被解析为:
Jacob,Smith,456,372,383
Contractor,#1,8dh,28j,153s
Testing2,Contrator,7463,99999,0283
解析其他列是无关紧要的,但显然数据是非常相关的,所以它必须保持不变。 (实际上还有几十个其他列,而不仅仅是三个)。
为了了解我实际上有多少重复,我运行了这个脚本(取自之前的帖子):
with open('1.csv','r') as in_file, open('2.csv','w') as out_file:
seen = set() # set for fast O(1) amortized lookup
for line in in_file:
if line in seen: continue # skip duplicate
seen.add(line)
out_file.write(line)
不过对我的需求来说太简单了。
【问题讨论】:
-
您的重复条目在 other 列中具有不同的值。您如何决定要保留哪些价值观?
-
制表符分隔吗?
-
wwii - 是的,每个服务器都有不同的加密,所以即使真实值相同,它在数据库中的记录也是不同的。我将保留与当前服务器关联的值(大写名称)。但由于我将仅使用唯一名称附加当前数据库,因此这无关紧要。
-
Padraic C - 目前,它是逗号分隔的。但我可以将其更改为方便的任何内容。
-
好的,那我们就可以使用csv模块了,我来编辑
标签: python database parsing csv python-3.x