我有2个文件old.txt和new.txt包含数十万个数据(接近约120万个密钥和相应金额)
new.txt
key |amount
abgc-nhd|8976
mkis-plqa-d|-254
mjsnh-kis-ls|987
njud-lo-sa|5291
mkjsh-kis-ls|686
mjsnh-fis-ls|387
njudd-kid-ls|-876
nswxd-lo-sa|3191
mki-ksjd-as|-56
old.txt
key |amount
mkjsh-kis-ls|686
njudd-kid-ls|-876
abgc-nhd|8976
mjsnh-kis-ls|987
njud-lo-sa|5291
mjsnh-fis-ls|387
mkis-plqa-d|-254
nswxd-lo-sa|3191
我想比较这两个文件。
ieI我想检查旧文件中的密钥是否与新文件中的密钥匹配。如果是,那么我必须比较它们的数量。
我尝试将所有值插入字典中,然后检查条目是否存在,但这需要更长的时间并且系统被挂起。
还有其他方法可以在密钥的基础上比较两个文件。
感谢。
答案 0 :(得分:2)
如果你可以使用pandas,你可以这样做:
new_txt = """key |amount
abgc-nhd|8976
mkis-plqa-d|-254
mjsnh-kis-ls|987
njud-lo-sa|5291
mkjsh-kis-ls|686
mjsnh-fis-ls|387
njudd-kid-ls|-876
nswxd-lo-sa|3191
mki-ksjd-as|-56"""
old_txt = """key |amount
mkjsh-kis-ls|686
njudd-kid-ls|-876
abgc-nhd|8976
mjsnh-kis-ls|987
njud-lo-sa|5291
mjsnh-fis-ls|387
mkis-plqa-d|-254
nswxd-lo-sa|3191"""
import pandas as pd
import io
df_new = pd.DataFrame.from_csv(io.StringIO(new_txt), sep="|")
df_old = pd.DataFrame.from_csv(io.StringIO(old_txt), sep="|")
print(df_new - df_old)
这给出了示例数据:
abgc-nhd 0
mjsnh-fis-ls 0
mjsnh-kis-ls 0
mki-ksjd-as NaN
mkis-plqa-d 0
mkjsh-kis-ls 0
njud-lo-sa 0
njudd-kid-ls 0
nswxd-lo-sa 0
NaN
表示此密钥仅存在于一个集合中。
答案 1 :(得分:0)
import csv
with open('new.txt') as infile:
records = {}
for k,v in csv.reader(infile):
records[k] = int(v)
with open('old.txt') as infile:
for k,v in csv.reader(infile):
if records[k] != int(v):
print("There is a mismatch in key", k)
答案 2 :(得分:0)
从您的代码段中,我看到文件中的条目未排序。因此,一个快速的解决方案是对文件的条目进行排序(如果顺序无关紧要),并比较两个文件中的行。
排序之后,比如说,file1中的line1以“abm ...”开头。& file2中的line1以“bcn ...”开头,然后没有必要检查以“a ...”开头的剩余条目对着file2中的行,因为没有这样的东西。
继续下一行并检查所有剩余的行。您还可以打印那些仅匹配的行并将其写入单独的文件中。此文件将只包含具有“常用”键的行。
此算法应该比O(n ^ 2)快。