啊,您想将多条记录合并为一条。我有一个 python 脚本可以做到这一点,available here。该版本设置为将 excel 文件转换为 csv,以及特定于该用例的一些其他内容。对于你,我会这样做:
import os
import sys
import csv
import argparse
from collections import defaultdict
from itertools import chain, izip_longest
def getunique(reader, uniqueFields, mergeFields):
"""Find all unique rows in the csv file, based on the unique fields given."""
rows = defaultdict(list)
for row in reader:
unique = '|'.join([row[f] for f in reader.fieldnames if f in uniqueFields])
merge = [row[f] for f in reader.fieldnames if f in mergeFields]
rows[unique].append(merge)
return rows
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process an csv file, converting multiple rows to one.', version='%(prog)s 1.0')
parser.add_argument('infile', type=str, help='excel input file')
args = parser.parse_args()
reader = csv.DictReader(open(args.infile, "rb"), dialect='excel')
uniqueFields = []
mergeFields = []
for field in reader.fieldnames:
tmp = raw_input("Is field {0} a: \nunique field? (1)\nignored field? (2)\nmerged field? (3)\n>> ".format(field))
if tmp == '1':
uniqueFields.append(field)
elif tmp == '2':
pass
else:
mergeFields.append(field)
unique = getunique(reader, uniqueFields, mergeFields)
fieldnames = uniqueFields
lengths = [len(merge) for merge in unique.itervalues()]
for i in range(1, max(lengths)+1):
fieldnames.extend(['_'.join((field,str(i))) for field in mergeFields])
writer = csv.DictWriter(open("export.csv", "wb"), fieldnames, dialect='excel')
writer.writeheader()
for unique, merge in unique.iteritems():
currData = unique.split("|")
for drug in merge:
currData.extend(drug)
currRow = izip_longest(fieldnames, currData, fillvalue='')
writer.writerow(dict(currRow))
## clean up and finishing section
del reader
del writer
编辑:第二个版本不添加额外字段,并输入请求的(1) 标记。但是,它隐含地假设 id 字段被忽略,并替换为(未排序的)字典中的当前条目。当然,这可以更改,但没有关于多个 id 中的哪一个适合具有相同字段 2 的行的信息。它还假设 id 字段称为id。
import os
import sys
import csv
import argparse
from collections import defaultdict
from itertools import chain, izip_longest
def getunique(reader, uniqueFields, mergeFields):
"""Find all unique rows in the csv file, based on the unique fields given."""
rows = defaultdict(list)
for row in reader:
unique = '|'.join([row[f] for f in reader.fieldnames if f in uniqueFields])
merge = [(f, row[f]) for f in reader.fieldnames if f in mergeFields]
rows[unique].append(merge)
return rows
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process an csv file, converting multiple rows to one.', version='%(prog)s 1.0')
parser.add_argument('infile', type=str, help='excel input file')
args = parser.parse_args()
reader = csv.DictReader(open(args.infile, "rb"), dialect='excel')
uniqueFields = []
mergeFields = []
for field in reader.fieldnames:
tmp = raw_input("Is field {0} a: \nunique field? (1)\nignored field? (2)\nmerged field? (3)\n>> ".format(field))
if tmp == '1':
uniqueFields.append(field)
elif tmp == '2':
pass
else:
mergeFields.append(field)
unique = getunique(reader, uniqueFields, mergeFields)
writer = csv.DictWriter(open("export.csv", "wb"), reader.fieldnames, dialect='excel')
writer.writeheader()
for rowID, (unique, merge) in enumerate(unique.iteritems()):
currData = defaultdict(list)
for field, data in izip_longest(fieldnames, currData, fillvalue=''):
currData[field].append(data)
for n,data in enumerate(merge):
currData[data[0]].append("({0}) {1}".format(n+1, data[1]))
currData['id'] = str(rowID + 1)
currRow = {}
for key,value in currData.iteritems():
currRow[key] = ''.join(value)
writer.writerow(currRow)
## clean up and finishing section
del reader
del writer