【问题标题】:merge csv files with different column order remove duplicates合并具有不同列顺序的 csv 文件删除重复项
【发布时间】:2014-04-25 02:52:29
【问题描述】:

我有多个列数相同但列顺序不同的 CSV 文件,我想合并它们以删除重复项,这里的所有其他解决方案都没有考虑列顺序,因此合并输出不正确,因此如何在Windows 命令行(例如 logparser)或 bash?

实现这一点的python脚本也可以。

【问题讨论】:

  • 只是说您想“合并它们以删除重复项”而您还“考虑列顺序”有一些歧义。输入文件和所需输出的示例会有所帮助。

标签: python bash csv duplicate-removal merging-data


【解决方案1】:

以下脚本在以下情况下正常工作:

  • csv 不会太大(即可以加载到内存中)
  • CSV 的第一行包含列名

您只需填写filesfinal_headers

import csv

files = ['c1.csv', 'c2.csv', 'c3.csv']
final_headers = ['col1', 'col2', 'col3']

merged_rows = set()
for f in files:
    with open(f, 'rb') as csv_in:
        csvreader = csv.reader(csv_in, delimiter=',')
    headers = dict((h, i) for i, h in enumerate(csvreader.next()))
        for row in csvreader:
            merged_rows.add(tuple(row[headers[x]] for x in final_headers))
with open('output.csv', 'wb') as csv_out:
    csvwriter = csv.writer(csv_out, delimiter=',')
    csvwriter.writerows(merged_rows)

【讨论】:

  • 命名元组如何帮助检测重复项?如果文件中有噪音怎么办?
  • @Ali 我做了一些更改(实际上命名元组不是必需的)。不允许重复元素的set“检测到”重复项。您是否期望标题名称中有噪音?
  • 是的,这个集合不允许重复,但是元组作为一个整体表现得像一个字符串吗?
  • @Ali 我不确定你的意思。元组是可散列的(这就是您可以将其用作设置值的原因),并且包含相同值的两个元组被认为是相等的。关于这种情况,还有哪些元组行为让您感到疑惑?
【解决方案2】:

csvkit'scsvjoin 可以做到。

csvjoin -c "Column 1,Column 2" --outer file1.csv file2.csv

【讨论】:

    【解决方案3】:

    就个人而言,我会将合并文件和删除重复项这两个任务分开。如果可以的话,我还建议使用数据库而不是 CSV 文件,因为管理数据库中的列更容易。

    这是一个使用 Python 的示例,它有一个易于使用的 csv 库。

    import csv
    with open(srcPath, 'r') as srcCSV:
        csvReader = csv.reader(csvFile, delimiter = ',')
    
        with open(destPath, 'rw') as destCSV:
            csvWriter = csv.writer(destCSV, delimiter = ',')        
    
            for record in csvReader:
                csvWriter.writerow(record[1],record[3],record[2], ... record[n])
    

    这允许您以您选择的任何顺序重写列。目标 CSV 可以是您扩展的现有 CSV,也可以是格式更好的新 CSV。使用 CSV 库将有助于防止在其他地方发生的转录错误。

    合并数据后,您可以使用同一个库来遍历单个数据文件,以识别相同的记录。

    注意:此方法一次读取和写入文件一行,因此它可以处理任意大小的文件。我使用这种方法从每个 6 GB 大的文件中合并了 2.21 亿条记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2020-07-25
      • 2013-10-10
      • 2018-01-15
      相关资源
      最近更新 更多