将2个csv文件合并为一个唯一列但标题不同

时间:2015-08-26 01:06:02

标签: python bash csv

我想使用某种脚本语言(如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()

#########################################################################

只是在这个网站上阅读并尝试了这段代码(操作)

2 个答案:

答案 0 :(得分:1)

由于您尚未发布尝试,我将为您提供一般答案(使用Python),以帮助您入门。

  • 创建dictd
  • 迭代第一个文件的所有行,将每行转换为列表并将其存储在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 answerpandas 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