我想使用某种脚本语言(如 bash 脚本或 python)合并 2 个 csv 文件。
1st.csv(此数据来自mysql查询)
member_id,name,email,desc
03141,ej,ej@domain.com,cool
00002,jes,jes@domain.com,good
00002,charmie,charm@domain.com,sweet
2nd.csv(来自 mongodb 查询)
id,address,create_date
00002,someCity,20150825
00003,newCity,20140102
11111,,20150808
这些例子不是实际的,尽管我知道 qsl 中的一些 member_id 和 mongodb 中的 id 是相同的。 (*我希望我的输出是这样的)
所需输出.csv
meber_id,name,email,desc,address,create_date
03141,ej,ej@domain.com,cool,,
00002,jes,jes@domain.com,good,someCity,20150825
00002,charmie,charm@domain.com,sweet,
11111,,,,20150808
我们将非常感谢您的帮助。提前致谢
#########################################################################
#!/usr/bin/python
import csv
import itertools as IT
filenames = ['1st.csv', '2nd.csv']
handles = [open(filename, 'rb') for filename in filenames]
readers = [csv.reader(f, delimiter=',') for f in handles]
with open('desiredoutput.csv', 'wb') as h:
writer = csv.writer(h, delimiter=',', lineterminator='\n', )
for rows in IT.izip_longest(*readers, fillvalue=['']*2):
combined_row = []
for row in rows:
row = row[:1] # column where 1 know there are identical data
if len(row) == 1:
combined_row.extend(row)
else:
combined_row.extend(['']*1)
writer.writerow(combined_row)
for f in handles:
f.close()
#########################################################################
刚刚在这个网站上阅读并尝试了这段代码(操作)
最佳答案
由于您尚未发布尝试,我将为您提供一个一般性答案(使用 Python)来帮助您入门。
- 创建一个
dict
,d
- 迭代第一个文件的所有行,将每一行转换为一个列表,并将其存储在
d
中,使用meber_id
作为键,列表作为值。 - 迭代第二个文件的所有行,将每行转换为一个列表,保留
id
列,并使用新的列更新d[id]
下的列表如果d[id]
存在则列出,否则将新列表存储在d[id]
下。 - 最后,迭代
d
中的值并将它们打印出来(以逗号分隔)到文件中。
编辑
在您的尝试中,您尝试使用 izip_longest
同时迭代两个文件的行。但只有当两个文件中的行数相同且顺序相同时,此方法才有效。
无论如何,这是一种方法。
注意:这是使用 Python 3.4+ csv
模块。对于 2.7,它可能看起来有点不同。
import csv
d = {}
with open("file1.csv", newline="") as f:
for row in csv.reader(f):
d.setdefault(row[0], []).append(row + [""] * 3)
with open("file2.csv", newline="") as f:
for row in csv.reader(f):
old_row = d.setdefault(row[0][0], [row[0], "", "", ""])
old_row[4:] = row[1:]
with open("out.csv", "w", newline="") as f:
writer = csv.writer(f)
for rows in d.values():
writer.writerows(rows)
关于python - 将 2 个 csv 文件与一个唯一列但不同的标题合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216423/