我想使用某种脚本语言(如bash脚本或python)合并2个csv文件。
1st.csv(此数据来自mysql查询)
member_id,姓名,电子邮件,内容描述
03141,EJ,EJ @ domain.com,酷
00002,JES,JES @ domain.com,好
00002,charmie,魅力@ domain.com,甜
2nd.csv(来自mongodb查询)
ID,地址,CREATE_DATE
00002,someCity,20150825个
00003,newCity,20140102个
11111,,20150808
示例不是实际的,但我知道来自qsl的一些member_id和来自mongodb的id是相同的。 (*我希望我的输出会是这样的)
desiredoutput.csv
meber_id,姓名,电子邮件,内容描述,地址,CREATE_DATE
03141,EJ,EJ @ domain.com,冷静,,
00002,JES,JES @ domain.com,好,someCity,20150825
00002,charmie,魅力@ domain.com,甜,
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()
#########################################################################
只是在这个网站上阅读并尝试了这段代码(操作)
答案 0 :(得分:1)
由于您尚未发布尝试,我将为您提供一般答案(使用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)
答案 1 :(得分:0)
以下是使用pandas的建议我已经from this answer和pandas doc about merging。
import pandas as pd
first = pd.read_csv('1st.csv')
second = pd.read_csv('2nd.csv')
merged = pd.concat([first, second], axis=1)
这将输出:
meber_id name email desc id address create_date
3141 ej ej@domain.com cool 2 someCity 20150825
2 jes jes@domain.com good 11 newCity 20140102
11 charmie charm@domain.com sweet 11111 NaN 20150808