2015-08-26 30 views
1

我想使用一些腳本語言(如bash腳本或python)合併2 csv文件。合併2 csv文件與一個唯一的列,但不同的標題

1st.csv(此數據是從MySQL查詢)

member_id,姓名,電子郵件,說明
03141,EJ,EJ @ domain.com,酷
00002,JES,JES @域名.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

你有沒有問之前做了什麼? – itwasntme

+0

是的我已經嘗試使用bash進行合併,發生(它合併,但它確實在單個信息中創建重複而不是合併)im新的腳本請求幫助 – chareon

+0

使用正則表達式在csv中查找匹配的模式。 – itwasntme

回答

1

因爲我們還沒有發佈一個嘗試,我給你(使用Python)一般的回答讓你開始了。

  • 在第一個文件中的所有行創建dictd
  • 迭代,每一行轉換成一個列表,並使用meber_id爲重點和列表作爲值它存儲在d
  • 遍歷第二個文件中的所有行,將每個行插入留出了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) 
+0

謝謝你,一些我是如何得到算法的。我可以在哪裏可以玩和學習一些代碼。這對我來說將是很大的幫助 – chareon

+0

對這段代碼>>> d.setdefault(row [0],[row [0],「」,「」,「」])。extend(row [1:])<< <如果我想在我的member_id中保留重複項,該怎麼辦?謝謝 – chareon

+0

我不太明白這個問題。你有重複的'member_id's? –

0

這裏有一個建議使用熊貓我有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  [email protected] cool 2  someCity 20150825 
2   jes  [email protected] good 11  newCity  20140102 
11  charmie [email protected] sweet 11111 NaN   20150808 
+0

實際上你所做的只是合併,我真正需要的是我合併信息member_id = id,包括有關列的信息和行。順便說一句,謝謝 – chareon

+0

你想使用外[[join]](http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging)。所以'pd.merge(first,second,how =「outer」,left_on =「meber_id」,right_on =「id」)'應該這樣做。 –

相關問題