我有多个具有相同列数的CSV文件但每个列中的列顺序不同,我想合并它们删除重复项,这里所有其他解决方案都不考虑列顺序因此合并输出不正确,因此如何在Windows命令行(例如logparser)还是bash?
实现这一目标的python脚本也可以。
答案 0 :(得分:1)
以下脚本在以下情况下正常运行:
您只需填写files
和final_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)
答案 1 :(得分:1)
答案 2 :(得分: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的文件中整合了221百万条记录。