2017-06-29 64 views
1

我有三個的.csv文件:猛砸加盟的csv文件

File1.csv

Header1 
data1;data2;data3 

File2.csv

Header2 
data1;data2;data3 
data1;data2;data3 

File3.csv

Header3 
data1;data2;data3 

我想要像這樣加入他們:

Header1;  ;  ;Header2;  ;  ;Header3;  ; 
data1 ;data2;data3;data1 ;data2;data3;data1 ;data2;data3 
     ;  ;  ;data1 ;data2;data3;  ;  ; 

我一直試圖加入與paste文件,但列不斷混合。我認爲這是因爲有時其中一個文件沒有數據(只有標題)或File2.csv比File1.csv有更多的數據。在這種情況下,它應該是這樣的:

Header1;  ;  ;Header2;  ;  ;Header3;  ; 
     ;  ;  ;data1 ;data2;data3;data1 ;data2;data3 
     ;  ;  ;data1 ;data2;data3;  ;  ; 

paste完成這一任務的最好方法是什麼?

ps。我可以改變.csv文件的創建方式。我現在使用分號作爲分隔符,但如果它更容易,可以更改它。

+0

我可能會寫Perl/Python/Ruby的東西。我認爲一個簡單的命令行實用工具(如paste(或join))不會處理您的特定場景 –

+0

列的數量是否已修復?如果它們不是固定的,則空文件可能總是隻導致一列。在給出的例子中,你有三列用於一個空文件(僅帶有標題的文件) – Naks

+0

是的,列數是固定的。我可以更改標題後跟兩個空單元格,如果這有幫助的話(例如,header ;;)。 – Matter

回答

1

的Python解決方案:

merge_csv.py腳本:

import sys 
with open(sys.argv[1], 'r') as f1, open(sys.argv[2], 'r') as f2, open(sys.argv[3], 'r') as f3: 

    f1_lines, f2_lines, f3_lines = f1.read().splitlines(), f2.read().splitlines(), f3.read().splitlines() 
    max_lines = max(len(i) for i in (f1_lines, f2_lines, f3_lines)) 
    fmt = '{:7s};' * 8 + '{:7s}' 

    for i in range(max_lines): 
     if i == 0: 
      print(fmt.format(f1_lines[i],'','',f2_lines[i],'','',f3_lines[i],'','')) 
     else: 
      f1_args = f1_lines[i].split(';') if i < len(f1_lines) else ['', '', ''] 
      f2_args = f2_lines[i].split(';') if i < len(f2_lines) else ['', '', ''] 
      f3_args = f3_lines[i].split(';') if i < len(f3_lines) else ['', '', ''] 
      print(fmt.format(*(f1_args + f2_args + f3_args))) 

用法

python merge_csv.py File1.csv File2.csv File3.csv 

輸出:

Header1;  ;  ;Header2;  ;  ;Header3;  ;  
data1 ;data2 ;data3 ;data1 ;data2 ;data3 ;data1 ;data2 ;data3 
     ;  ;  ;data1 ;data2 ;data3 ;  ;  ; 
+0

謝謝!這如所述那樣工作。現在我已經將腳本更改爲可以處理更多列。最多7列工作正常,但當我嘗試8列時,它給了我一個錯誤:'追溯(最近調用最後): 文件「merge_csv.py」,第15行,在 print(fmt.format(*(f1_args + f2_args + f3_args))) IndexError:元組索引超出範圍 – Matter

+0

分享您的更改,以便我可以看到它們(比方說通過https://pastebin.com/) – RomanPerekhrest

+0

https://pastebin.com/u9nZZ0Zh – Matter