【问题标题】:Python or bash: Merging two csv files based on several matching field values, formatting, the outputting CSVPython 或 bash:根据多个匹配的字段值、格式、输出 CSV 合并两个 csv 文件
【发布时间】:2012-03-28 00:20:55
【问题描述】:

我更喜欢在 Python 中使用它,因为我正在努力学习更多。不过,如果您可以在 bash 中提供帮助,那仍然会有所帮助。

我环顾 Stack Overflow,发现了一些有用的东西,但还不足以让我完成这项工作。

我有两个包含一些共享字段的 CSV 文件。数据不是INT。我想根据匹配的 3 个特定字段加入,并在所有处理完成后将其写入新的output.csv

sourceA.csv 看起来像这样:

fieldname_1,fieldname_2,fieldname_3,fieldname_4,fieldname_5,fieldname_6,fieldname_7,fieldname_8,fieldname_9,fieldname_10,fieldname_11,fieldname_12,fieldname_13,fieldname_14,fieldname_15,fieldname_16

sourceB.csv 看起来像这样:

fieldname_4,fieldname_5,fieldname_OTHER,fieldname_8,fieldname_16

如您所见,sourceB.csv 有 4 个字段名称也在 sourceA.csv 中,还有一个字段名称不在。 fieldname_OTHER中的数据需要替换sourceA[fieldname_6]中的数据。

整个过程应该是这样的:

  • 如果满足以下所有条件,则将 sourceA[fieldname_6] 中的数据替换为 sourceB[fieldname_OTHER] 中的数据:

    data in sourceA[fieldname_4]=sourceB[fieldname_4]
    
    data in sourceA[fieldname_8]=sourceB[fieldname_8]
    
    data in sourceA[fieldname_16]=sourceB[fieldname_16]
    

    sourceB[fieldname_5]中的数据不需要评估。)

  • 如果不满足上述条件,只需将sourceA[fieldname_6] 替换为文本ANY

  • 将每个已处理的行写入output.csv

我希望输出基于上述输入 CSV 和处理的示例:

dataA,dataB,dataC,dataD,dataE,dataOTHER,dataG,dataH,dataI,dataJ,dataK,dataL,dataM,dataN,dataO,dataP

我希望我所提供的详细信息没有造成不必要的混乱。感谢您的所有帮助!

【问题讨论】:

  • 将 csv 文件加载到 MYSQL 中的两个表中,然后进行连接。这种类型的操作就是关系数据库的全部内容。如果这是您必须经常做的事情,那么数据属于 MySQL。
  • 什么是dataA、dataB等?如果在 sourceA 行和 sourceB 行之间的这三个字段上有两个或多个匹配项,应该怎么办? sourceA 和 sourceB 各有多少行?
  • 使用 MySQL 连接听起来确实是这项工作的最佳建议。
  • 请尽量简化。我很确定并非所有字段都与此问题相关。

标签: python bash sorting join csv


【解决方案1】:

我不确定我是否会为这样的一次性合并而烦恼 SQL。在 python 中很简单。

使用csv 模块读取这两个文件,以获得两个列表。将 sourceA 索引到一个字典中,该字典的键是需要匹配的字段的元组。然后,您可以遍历 sourceB,立即找到匹配的行,并从 sourceB 合并到其中。

完成后,您可以输出从 sourceA 读取的 list:dict 和 list 指向相同的值,您现在已经更新了这些值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多