2013-07-19 227 views
2

所以我一直在毆打互聯網整天尋找一種方法來結合多個CSV文件。無論我查找的30多種PowerShell方法中有哪一種,我都會遇到問題。合併多個CSV文件

我想將多個CSV文件合併爲一個,實質上是「完全連接」風格。我需要結合來自所有CSV的所有行和所有列的組合,除了我想基於公共標識符組合行之外。這個討論:「Merging two CSV files by shared column」,正是我想要做的兩個例外。首先它只爲兩個CSV構建,如果兩個CSV都不包含「名稱」,則它將丟棄行。我想保留該行,即使它不在兩個CSV中,也只是在其他CSV中沒有數據的情況下創建空白條目。

CSV1.csv

Name,Attrib1,Attrib2 

VM1,111,True 
VM2,222,False 

CSV2.csv

Name,AttribA,Attrib1 

VM1,AAA,111 
VM3,CCC,333 

CSV3.csv

Name,Attrib2,AttribB 

VM2,False,YYY 
VM3,True,ZZZ 

期望綜合作用的結果:

Name,Attrib1,Attrib2,AttribA,AttribB 

VM1,111,True,AAA, 
VM2,222,False,,YYY 
VM3,333,True,CCC,ZZZ 

任何人有這個什麼想法?如果您需要我的更多信息,請告訴我。

更新:這是我當前的代碼嘗試與SQLite的外殼:

$db = Join-Path $env:TEMP 'temp.db' 
$dir = "C:\Users\UserName\Downloads\CSV Combination" 
$outfile = Join-Path $dir 'combined.csv' 

@" 
CREATE TABLE a (Name varchar(20),OS varchar(20),IP varchar(20),Contact varchar(20),Application varchar(20)); 
CREATE TABLE b (Name varchar(20)); 
CREATE TABLE c (Name varchar(20),Quiesce varchar(20)); 
CREATE TABLE d (Name varchar(20),NoQuiesce varchar(20)); 
.mode csv 
.import '$((Join-Path $dir csv1.csv) -replace '\\', '\\')' a 
.import '$((Join-Path $dir csv2.csv) -replace '\\', '\\')' b 
.import '$((Join-Path $dir csv3.csv) -replace '\\', '\\')' c 
.import '$((Join-Path $dir csv4.csv) -replace '\\', '\\')' d 
SELECT a.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce 
FROM a 
    LEFT OUTER JOIN b ON a.Name = b.Name 
    LEFT OUTER JOIN c ON a.Name = c.Name 
    LEFT OUTER JOIN d ON a.Name = d.Name 
UNION 
SELECT b.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce 
FROM b 
    LEFT OUTER JOIN a ON a.Name = b.Name 
    LEFT OUTER JOIN c ON b.Name = c.Name 
    LEFT OUTER JOIN d ON c.Name = d.Name 
UNION 
SELECT c.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce 
FROM c 
    LEFT OUTER JOIN a ON a.Name = c.Name 
    LEFT OUTER JOIN b ON b.Name = c.Name 
    LEFT OUTER JOIN d ON c.Name = d.Name; 
"@ | filesystem::"C:\Users\UserName\Downloads\CSV Combination\sqlite3.exe" $db >$outfile 

Remove-Item $db 

目前這返回以下錯誤信息:

sqlite3.exe:錯誤:C:\用戶\ brandon.andritsch \下載\ CSV組合\ csv1.csv線1:預期數據的5列,但發現6

回答

0

嘗試這種情況:

$db = Join-Path $env:TEMP 'temp.db' 
$dir = "C:\some\folder" 
$outfile = Join-Path $dir 'combined.csv' 

@" 
CREATE TABLE a (Name varchar(20),Attrib1 varchar(20),Attrib2 varchar(20)); 
CREATE TABLE b (Name varchar(20),AttribA varchar(20),Attrib1 varchar(20)); 
CREATE TABLE c (Name varchar(20),Attrib2 varchar(20),AttribB varchar(20)); 
.mode csv 
.import '$((Join-Path $dir csv1.csv) -replace '\\', '\\')' a 
.import '$((Join-Path $dir csv2.csv) -replace '\\', '\\')' b 
.import '$((Join-Path $dir csv3.csv) -replace '\\', '\\')' c 
SELECT a.Name,a.Attrib1,a.Attrib2,b.AttribA,c.AttribB 
FROM a 
    LEFT OUTER JOIN b ON a.Name = b.Name 
    LEFT OUTER JOIN c ON a.Name = c.Name 
UNION 
SELECT b.Name,a.Attrib1,a.Attrib2,b.AttribA,c.AttribB 
FROM b 
    LEFT OUTER JOIN a ON a.Name = b.Name 
    LEFT OUTER JOIN c ON b.Name = c.Name 
UNION 
SELECT c.Name,a.Attrib1,a.Attrib2,b.AttribA,c.AttribB 
FROM c 
    LEFT OUTER JOIN a ON a.Name = c.Name 
    LEFT OUTER JOIN b ON b.Name = c.Name; 
"@ | sqlite3 $db >$outfile 

Remove-Item $db 

爲此需要使用SQLite命令行shell。

+0

嗨Ansgar,感謝這個腳本,我不知道我將能夠獲得SQLite設置,我沒有實際將它放在System32目錄中的權限。 我能夠得到它運行(我認爲)使用本地配置文件目錄,這裏是我回到我的錯誤: sqlite3.exe:錯誤:未知的命令或無效的參數:「導入」。輸入「.help」以獲得幫助 – user2600210

+0

命令行shell是一個帶有單個可執行文件的Zip存檔。簡單地將它解壓到你的'%PATH%'目錄中。至於錯誤:命令是'.import',而不是'import'。 –

+0

'.import $((Join-Path $ dir csv1.csv)-replace'\\','\\')a'' ''.import $((Join-Path $ dir csv2.csv) - 替換'\\','\\')b'' ''.import $((Join-Path $ dir csv3.csv)-replace'\\','\\')c'' 這些是我使用的命令 - 我不知道%PATH%指的是什麼,在此之後我沒有看到一個變量,當它位於當前工作目錄中時,出現以下錯誤: 術語'sqlite3.exe'不被識別爲cmdlet,函數,腳本文件或可操作程序的名稱。還有沒有辦法格式化這個評論文本?這看起來很糟糕。 – user2600210