0

我想计算两个 csv(制表符分隔)文件中相似和不同条目的数量。

我一直在尝试使用 python difflib来完成这项工作。下面是两个输入文件的简化版本。它们很大,有很多列。

文件A

 ABC1 ABC2    SYMBOL EXCHANGE  NAME    ABC2  ABC3   
 234   f24     AAPL   NYSE     APPLE Inc.
 23f3  ef23    ab3c    jjm     Google     
 sf2d  df23    xyz     tsx     YourCompany

文件B

Exchange  Symbol  Name
 Tok      aapl     Apple Jap.
 NYSE     QUAL     Qualcom inc.
 NYSE     GOOG     Google   

寻找相似性的规则:

  1. 首先检查 Exchange 和 Symbol 是否匹配。如果它匹配,那么你有一个匹配
  2. 如果不匹配,则检查匹配的名称。如果名称匹配,那么你得到了匹配。

ABC1、ABC2 列仅用于演示目的,比较条目时请忽略它们。

原因,我不能单独检查名称,因为大多数公司名称在不同的交易所都有不同的前缀/后缀,或者它们使用不同的语言。但是交换和符号只有在这两个文件中是英文的。

上述示例的示例输出:

FileA and FileB has 2 number of common companies.
FileA has 1 number of companies which are not in FileB
FileB has 1 number of companies which are not in FileA

我是 python 新手,到目前为止,我的 diff 代码可以正常工作,但还有很长的路要走。想把这个问题放在这里。

import difflib

diff = difflib.ndiff(open("fileA").readlines(), open("fileB").readlines())

try:
    while 1:
        print diff.next(),
except:
    pass
4

2 回答 2

0

如果不知道您的数据是否包含重复项以及您希望如何处理它们,这很难回答。

集合操作非常快,因此我建议将一个文件解析为两个集合,并循环通过另一个文件中的行来实现您的比较标准。

import csv
alist, blist = [], []

with open("fileA.tsv", "rb") as fileA:
    reader = csv.reader(fileA, delimiter='\t')
    for row in reader:
        alist.append(row)
with open("fileB.tsv", "rb") as fileB:
    reader = csv.reader(fileB, delimiter='\t')
    for row in reader:
        blist.append(row)

se_set_a = set([(row[2], row[3]) for row in alist])
name_set_a = set([row[4].strip() for row in alist])
symbol_exchange_matches = []
name_matches = []
for row in blist:
    if (row[1], row[0]) in se_set_a:
        symbol_exchange_matches.append((row[1], row[0]))
    elif row[2].strip() in name_set_a:
        name_matches.append(row[2])

matches = symbol_exchange_matches + name_matches
print "FileA and FileB have %i number of common companies." % (len(set(matches)),)

使用您的示例数据,我只找到一家常见的公司:名称为“Google”。根据您的标准,Apple 不匹配。

于 2013-08-09T20:49:12.597 回答
0

我想说你只需要每个文件一个字典,将公司名称映射到一个(交换,股票代码)元组。

文件 1 特有的常见元素和元素:

common_elements = {}
unique_to_file_1 = {}
for key, value in file1_dict.iteritems():
  if key in file2_dict.keys() or value in file2_dict.values():
    common_elements[key] = value
  else:
    unique_to_file_1[key] = value

文件 2 独有的元素:

unique_to_file_2 = {}
for key, value in file2_dict.iteritems():
  if key not in common_elements.keys() and value not in common_elements.values():
    unique_to_file_2[key] = value

我相信您确实知道如何从 CSV 文件创建这两个字典。

于 2013-08-09T20:14:17.293 回答