0

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

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

4

3 回答 3

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)
于 2014-04-25T07:18:22.477 回答
1

csvkit 的 csvjoin可以做到这一点。

csvjoin -c "Column 1,Column 2" --outer file1.csv file2.csv
于 2015-04-09T14:21:14.673 回答
0

就个人而言,我会将合并文件和删除重复项这两个任务分开。如果可以的话,我还建议使用数据库而不是 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 亿条记录。

于 2014-04-25T05:54:24.937 回答