2015-12-23 22 views
0

我會盡我所能將它儘可能簡化。在csv中添加現有列,方法是將數值與數組匹配,並使用條件

是我迄今爲止所工作:

目前我有兩個CSV文件中...

test1.csv

test1ColumnN,test1ColumnI,test1ColumnD,selectDomainOne,selectDomainTwo,selectDomainThree 
asdf,asdf,asdf,,, 
nValue1,iValue1,dValue1,sValue1,, 
qwer,asdf,zxcv,,, 
nValue2,iValue2,dValue2,,, 
qwer,zxcv,asdf,lkjh,, 
nValue3,iValue3,dValue3,sValue3,, 
zxcv,qwer,asdf,,poiu, 
nValue1,iValue1,dValue1,,sValue1, 
nValue4,iValue4,dValue4,,sValue4, 
asdf,qwer,zxcv,fghj,mnbv, 
nValue5,iValue5,dValue5,,, 
asdf,cvbn,erty,,,uytr 
nValue7,iValue7,dValue7,,,sValue7 
nValue8,iValue8,dValue8,,,sValue8 
nValue9,iValue9,dValue9,,,sValue9 
qwer,asdf,zxcv,poiu,lkjh,mnbv 

test2.csv

DomainCatagories,test2ColumnS,test2ColumnA,test2ColumnN,test2ColumnI,test2ColumnD 
DomainOne,sValue1,aValue1,nValue1,,dValueN 
DomainOne,sValue2,aValue2,,iValue2,dValue2 
DomainOne,sValue3,aValue2,nValue3,iValue3,dValue3 
DomainTwo,sValue1,aValue2,,iValue1,dValueN 
DomainTwo,sValue4,aValue1,nValue4,,dValueN 
DomainTwo,sValue5,aValue1,nValue5,iValue5,dValue5 
DomainThree,sValue7,aValue2,nValue7,iValue7,dValue7 
DomainThree,sValue8,aValue1,nValue8,iValue8,dValue8 
DomainThree,sValue9,aValue2,nValue9,iValue9,dValue9 

現在我想添加一個列(在test2.csv中)以匹配來自test1.csv和tes的sValue#與($_.DomainCatagories='DomainOne'從test2.csv)和($_.selectDomainOne從test1.csv)的條件t2.csv

要做到這一點,我使用下面的代碼...

#Create Column 
$domainNameOne = @{} 
$domainNameOne = Import-Csv 'C:\Scripts\Tests\test1.csv' | Where-Object {$_.selectDomainOne} | Select-Object -Expand 'selectDomainOne' 

(Import-Csv 'C:\Scripts\Tests\test2.csv') | 
    Select-Object -Property *, @{n='Test1sValues';e={ 
    if($_.DomainCatagories -eq 'DomainOne'){ 
     if(($domainNameOne -contains $_.test2ColumnS) -and ($_.test2ColumnS)){ 
      $_.test2ColumnS 
     } Else { 
      'Not found in test1' 
    }}}} | Export-Csv "C:\Scripts\Tests\test2-Temp" -NoType 
    Move-Item "C:\Scripts\Tests\test2-Temp" 'C:\Scripts\Tests\test2.csv' -Force 

代碼後跑,我得到以下test2.csv(isCorrect)...

"DomainCatagories","test2ColumnS","test2ColumnA","test2ColumnN","test2ColumnI","test2ColumnD","Test1sValues" 
"DomainOne","sValue1","aValue1","nValue1","","dValueN","sValue1" 
"DomainOne","sValue2","aValue2","","iValue2","dValue2","Not found in test1" 
"DomainOne","sValue3","aValue2","nValue3","iValue3","dValue3","sValue3" 
"DomainTwo","sValue1","aValue2","","iValue1","dValueN","" 
"DomainTwo","sValue4","aValue1","nValue4","","dValueN","" 
"DomainTwo","sValue5","aValue1","nValue5","iValue5","dValue5","" 
"DomainThree","sValue7","aValue2","nValue7","iValue7","dValue7","" 
"DomainThree","sValue8","aValue1","nValue8","iValue8","dValue8","" 
"DomainThree","sValue9","aValue2","nValue9","iValue9","dValue9","" 

我有什麼不工作:

接下來我運行下面的代碼...

#Append Column 
$domainNameThree = @{} 
$domainNameThree = Import-Csv 'C:\Scripts\Tests\test1.csv' | Where-Object {$_.selectDomainThree} | Select-Object -Expand 'selectDomainThree' 

(Import-Csv 'C:\Scripts\Tests\test2.csv') | % { 
    if($_.DomainCatagories -eq 'DomainThree'){ 
     if(($domainNameThree -contains $_.test2ColumnS) -and ($_.test2ColumnS)){ 
      $_.Test1sValues = $_.test2ColumnS 
     } Else { 
      $_.Test1sValues = 'Not found in test1' 
    }}} | Export-Csv "C:\Scripts\Tests\test2-Temp" -NoType 
Move-Item "C:\Scripts\Tests\test2-Temp" 'C:\Scripts\Tests\test2.csv' -Force 

而不是在正確的行中添加值,它完全清空整個文件並將其保存爲empty file

最終目標

我想要什麼的代碼來生產,這是(在最後一列最後3行填寫通知值)...

"DomainCatagories","test2ColumnS","test2ColumnA","test2ColumnN","test2ColumnI","test2ColumnD","Test1sValues" 
"DomainOne","sValue1","aValue1","nValue1","","dValueN","sValue1" 
"DomainOne","sValue2","aValue2","","iValue2","dValue2","Not found in test1" 
"DomainOne","sValue3","aValue2","nValue3","iValue3","dValue3","sValue3" 
"DomainTwo","sValue1","aValue2","","iValue1","dValueN","" 
"DomainTwo","sValue4","aValue1","nValue4","","dValueN","" 
"DomainTwo","sValue5","aValue1","nValue5","iValue5","dValue5","" 
"DomainThree","sValue7","aValue2","nValue7","iValue7","dValue7","sValue7" 
"DomainThree","sValue8","aValue1","nValue8","iValue8","dValue8","sValue8" 
"DomainThree","sValue9","aValue2","nValue9","iValue9","dValue9","sValue9" 

我在做什麼錯那第二個代碼片段?

+0

@RyanBemrose的代碼是可重複使用的兩個給定的文件。我不明白我的問題是什麼問題。 –

+0

對我來說似乎很好。 Ryan可能會遇到MCVE的_Minimal_部分的問題 – Matt

+1

在你不工作的例子中,你沒有傳遞任何東西給管道。 '}} $ _} |如果方括號是正確的,Export-Csv「C:\ Scripts \ Tests \ test2-Temp」-NoType「可以工作。這應該輸出更新的對象回管道。你也可以使用像[我見過你之前做過的]計算的屬性(http:// stackoverflow。COM /問題/ 34423960 /比較-日期與 - 不同的格式,在-CSV文件)或'附加Member' – Matt

回答

0

您從顯示的示例我有什麼不工作:缺少關鍵部分。 Export-Csv將採取一切管道填充CSV,但你沒有提供任何。

問題是你沒有通過管道傳遞任何東西。只是更新一個屬性。最簡單的做法是在if聲明之後添加$_。或者,您可以使用您之前在另一個問題中完成的計算屬性。下面的示例從Compare dates with different formats in csv file甚至使用if語句。

Import-Csv $csvFile | Select-Object *, @{n='MatchDates';e={ if((([datetime]$_.Date1).Date -eq $_.Date3) -and (([datetime]$_.Date2).Date -eq $_.Date3) -and (([datetime]$_.Date1).Date -eq $_.Date2)){ 'Match Found' }Else{ 'No Match Found' }}} | 
    Export-Csv "$csvFile-results.csv" -NoTypeInformation -Force 
相關問題