繁体   English   中英

如何比较两个.csv 和.xlsx 文件并打印出与特定字段不匹配的内容?

[英]How to compare two .csv and .xlsx files and print out mismatched for a particular field?

因此,它们是否是两个不同的文件并不重要。csv 或 .xlsx 文件。 但是我需要一种通用的方法来判断不匹配的字段。 这两个文件在形状和大小方面都不同。

例如,文件 A 可能有 32,000 行,但文件 B 可能只有 16,000 行。 这是因为我试图从报告中比较两个不同数据库之间的偏差。 其中一个数据库是另一个数据库的来源。 例如:dbA 馈入 dbB,使 dbA 成为 dbB 的超集。

现在出现了问题,我试图在两个数据库中匹配employeeID。

例如,假设文件 A 包含以下内容

firstname, lastname, namekey, employeeID, SSN

文件 B 包含

firstname, lastname, namekey, username, email_address, phone_number, EmployeeID, SSN

我必须匹配的字段将基于employeeID=EmployeeID。 如何打印出仅显示 ID 不匹配的行的差异视图?

  • 我不想要文件 A 中不在文件 B 中的行
  • 我不想要文件 B 中不在文件 A 中的行
  • 我只想要根据两个文件中的某些标准员工 ID 不匹配的行

标准可以是任何东西,从技术上讲,我可以运行 SQL 命令来提取 .csv 或 .xlsx 文件以提取一些唯一键标识符,因为我们有通用名称但不同的员工 ID 号。

所以我想 SSN 可能是主要的过滤器,嘿,这个 ID 对于这个 SSN 是不同的。 我只需要一种方法来完成此操作并生成一个显示差异的文件。 因为我熟悉很多不同的东西,所以我不太关心我必须使用什么语言。 但主要是 Python 或其他一些可以很好地解析它并且不依赖于操作系统的工具。

到目前为止,我已经尝试过:

vimdiff
git diff --color-words="[^[:space:],]+" x.csv y.csv

他们都很好地展示了它,但我不希望两个文件中都不存在的行出现在 output 中。 否则,它只会产生很多噪音。

要从 csv 读取列中的所有值:

from csv import DictReader as csv_DictReader
csv_file = defaultdict(list)
filepath = "whatever/myfile.csv"
with filepath.open(encoding="cp1252") as file:
    reader = csv_DictReader(file)  
    for row in reader:
        for (k, v) in row.items():
            csv_file[k].append(v)
csv_column = csv_file['employeeID']  # Tell it what column to read

要从 excel 中读取列中的所有值:

from openpyxl import load_workbook
filepath = "whatever/myfile.xlsx"
excel_file = load_workbook(filepath)
excel_sheet = excel_file.active
excel_columns = {}
for column in "ABC": # Tell it what columns to read
    if column not in excel_columns:
        excel_columns[column] = []
    for row in range(1, excel_sheet.max_row + 1):
        cell_name = f"{column}{row}"
        recovered_columns[column].append(self.excel_sheet[cell_name].value)

所以我们已经阅读了整个文件,但现在你只有两个字典,一个是csv_column另一个是excel_columns

您现在要做的就是比较结果。

建议:打印csv_columnexcel_columns以检查您使用上面的这些代码得到了什么(因为让我们在这里完全诚实,那些我只是从我去年工作的项目中复制粘贴它们,但我已经忘记了其中的一半,所以我不完全确定 output。它只是工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM