合并具有不同列顺序的csv文件删除重复项

2024-05-15 07:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

另外python脚本也可以实现这一点。在


Tags: 文件csv命令行脚本bash顺序windows解决方案
3条回答

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

  • 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)

就个人而言,我会将合并文件和删除重复项这两项任务分开。如果可以的话,我还建议使用数据库而不是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库将有助于防止其他地方发生的转录错误。在

合并数据后,可以使用同一个库迭代单个数据文件,以标识相同的记录。在

注意:这个方法每次读写一行文件,所以它可以处理任何大小的文件。我用这个方法合并了2.21亿条记录,这些记录来自每个文件6 GB的大小。在

csvkit'scsvjoin可以做到这一点。在

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

相关问题 更多 >