【问题标题】:How to compare two .csv and .xlsx files and print out mismatched for a particular field?如何比较两个 .csv 和 .xlsx 文件并打印出与特定字段不匹配的内容?
【发布时间】:2020-05-06 05:57:17
【问题描述】:

因此,它们是两个不同的 .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

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

【问题讨论】:

    标签: python excel csv


    【解决方案1】:

    从 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 以检查您使用上面的这些代码得到了什么(因为让我们在这里完全诚实,那些我只是从我正在工作的项目中复制粘贴它们去年,但我已经忘记了一半,所以我不完全确定输出。它只是有效)。

    【讨论】:

    • 这会比较两个 .csv 或 .xlsx 文件吗,我只看到一个文件在代码中实例化为 excel_filecsv_file。我真的需要比较从两个数据库中提取的两个文件中的一列,当且仅当 employeeID 不匹配时打印出不一致。
    • 我也发现了这个,但它仍然在文件 A 和文件 B 中留下行,而我真的只需要像漂移报告这样的东西,只需在合并文件中输出不匹配的数据片段.
    • 顺便说一句,我非常感谢@Saelyth 的帮助和洞察力。
    • 抱歉回复晚了,我去睡觉了。所以...这些代码仅仅是“如何从 excel 中读取列”和“如何从 .csv 中读取列”。这只是尝试为您指明正确的方向,但并不完整。您需要修改代码以仅读取您需要的列。你还需要弄清楚如何比较结果。我建议您为此使用循环。很抱歉,我无法在这个话题上提供更多帮助。
    • 这不是问题我有一些可以帮助比较的东西,唯一的问题是它将所有行一起添加到一个连接文件中......所以实际上这两个文件被合并了突出差异。
    猜你喜欢
    • 2021-06-15
    • 2014-08-28
    • 2017-07-30
    • 1970-01-01
    • 2012-09-05
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多