2015-10-07 24 views
0

我需要結合一堆Excel電子表格。我使用PowerSHell將它們轉換爲CSV,現在需要合併它們,但不像您通常那樣。合併不使用連接。如果我有3個文件,每個文件有100行,我的新文件應該有300行。所以,這比聯合使用數據庫術語更多。合併csv的 - 沒有加入

某些列具有相同的名稱。有些不。如果它們具有相同的名稱,則不應創建新列。有沒有辦法做到這一點,而不必手動列出所有的列作爲屬性?

實施例(只有2個文件)

File1中:

Name Address 
Bob 123 Main 

文件2:

Name City 
Bob LA 
Tom Boston 

結果

Name Address City 
Bob 123 Main 
Bob   LA 
Tom   Boston 
+0

你怎麼知道要保留哪個屬性?只有那些被所有文件共享的文件?你有沒有嘗試過這個呢?回答第一個問題就是解決這個問題的答案。 – Matt

+0

我想要所有文件的所有屬性。我嘗試使用我在網上找到的連接對象函數並進行完全連接,但它不起作用。 – user1612851

+0

你有沒有爲此嘗試過......即使是最小的努力在這個問題上看起來不錯。 – Matt

回答

0

在一天結束時,這可能不是排序正確。這裏的技巧是讀取每個文件的頭文件並將其作爲字符串數組收集並刪除重複項。

此代碼假定所有文件都在相同的位置。如果沒有,你將需要解釋這一點。

$files = Get-ChildItem -Path 'C:\temp\csv\' -Filter '*.csv' | Select-Object -ExpandProperty FullName 

# Gather the headers for all the files. 
$headers = $files | ForEach-Object{ 
    (Get-Content $_ -Head 1).Split(",") | ForEach-Object{$_.Trim()} 
} | Sort-Object -Unique 

# Loop again now and read in the csv files as objects 
$files | ForEach-Object{ 
    Import-Csv $_ 
} | Select-Object $headers 

輸出應該是這樣的:

Address City Name 
------- ---- ---- 
123 Main  Bob 
     LA  Bob 
     Boston Tom 
+0

我會試試看。我認爲這是首先閱讀所有標題的正確策略。 – user1612851

+0

我認爲這有效!謝謝。你能想出一種簡單的方法來使用這種技術來組合不同名稱的列嗎?例如,如果列名是Name,Nm或Fullname,則將這些全部放在名爲name的列中。我知道我可以在最後做一個選擇並使用表達式。不知道這是否是最好的方法。 – user1612851

+0

@ user1921849我有一個方法的想法,但它不在這個問題的範圍內。你可以問一個新的問題,如果你想知道並引用這個問題。一種方法是根據已知的差異更改文件頭並重新保存。我可以想到另一個有活力的問題,但這個問題再次超出了範圍。 – Matt