比较两个大型csv文件并搜索相似的行

时间:2014-07-22 04:12:37

标签: python-2.7 csv

我有' conm' csv文件包含大约16,000行公司名称和'合同'包含公司名称和相应duns_number的大约50万行的csv文件。

conm.csv

AAR CORP
ACF INDUSTRIES HOLDING CORP
ADC TELECOMMUNICATIONS INC
AFA PROTECTIVE SYSTEMS INC
AFP IMAGING CORP
ALPHARMA INC  -CL A
........

contract.csv

"PRIME DENTAL SUPPLY INC.","088371229"
"MCMANIS ASSOCIATES INC","072637457"
"AT&T GOVERNMENT SOLUTIONS, INC","009683442"
"INPRO CORPORATION","106722606"
"MEDTRONIC, INC.","006261481"
"G C MICRO CORPORATION","157637570"
.......

如您所见,contract.csv未订购。

我正在尝试查看conm.csv中的公司名称是否在contract.csv中。 然而,问题是conm.csv和contract.csv中的公司名称在很多时候并不完全相同......许多人有拼写错误,有些包含额外的不必要的单词,或者在某些情况下,单词的顺序会被交换。

所以我决定逐行比较,通过执行以下方法找到匹配项:

  1. 通过删除特殊字符来清理字符串
  2. 看看它们是否完美匹配
  3. 如果不使用模糊 - 模糊库来测量两个字符串的比例,并且如果比率是> 1则通过。 95
  4. 到目前为止,这是我的代码。

    write_csv = open('result.csv', 'wb')
    writer = csv.writer(write_csv)
    
    with open(filename1, 'r') as f1:
        with open(filename2, 'r') as f2:        
            conm = csv.reader(f1)
            contract = csv.reader(f2)
    
            # save the conm file into list
            contract = list(contract)
    
            try:
                for row1 in conm:
                    # row to be appended in result.csv
                    row = []
                    name1 = simplify_string(row1[0])
    
                    for row2 in contract:
                        name2 = simplify_string(row2[0])
                        if check_same(name1, name2):
                            row.extend([name1, row2[1]])
                        elif fuzz.token_sort_ratio(name1, name3) > 95:
                                row.extend([name1, row2[1]])
    
                    if len(row) > 1:
                        writer.writerow(row)
    

    simplify_string方法删除所有标点符号等以清除conm.csv和contract.csv中的字符串。

    此代码的问题是我不知道此代码是否捕获所有匹配项并且不添加任何噪音。因此,编辑和运行此代码几次是不可避免的......

    但是,此代码运行速度极慢。上次在我的i5 cpu电脑上花了4天多时间。

    我想知道是否有提高性能的方法。或者也许有一种聪明的方法可以解决这类问题?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

您的simplify_string()方法是否使用正则表达式?如果没有,它应该,所以它会更快地清理参数。一个例子:

import re
def simplify_string(myString):
    return re.sub(r'[^\w]', ' ', cad)

re.sub()方法中的这个正则表达式[^ \ w]用空格替换非字母数字字符。您也可以用其他字符或空字符串替换它们。例如:

>>> someString = "This $String is go%ing to become clean, you'll see."
>>> simplify_string(someString):
'This String is go ing to become clean you ll see'

也许这个正则表达式不足以满足您的需求,但您可以构建更强大的正则表达式。这是一个更深入解释如何构建和使用正则表达式的链接:

Regular expression operations

这可能会让它快一点。我希望它会有所帮助。