【问题标题】:Append existing column in csv by matching values with array and with condition通过将值与数组和条件匹配来在 csv 中追加现有列
【发布时间】:2015-12-24 07:57:25
【问题描述】:

我会尽我所能,尽可能简单地分解它。

到目前为止我的工作:

目前我有两个 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 和 test2.csv 的 sValue# 与条件($_.DomainCatagories='DomainOne' from test2.csv)和($_.selectDomainOne from test1.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"

我在第二个代码 sn-p 中做错了什么?

【问题讨论】:

  • @RyanBemrose 该代码可通过两个给定文件重现。我看不出我的问题有什么问题。
  • 对我来说似乎很好。 Ryan 可能对 MCVE 的 Minimal 部分有问题
  • 在你不工作的例子中,你没有向管道传递任何东西。如果括号正确,}} $_} | Export-Csv "C:\Scripts\Tests\test2-Temp" -NoType 可以工作。那应该将更新的对象输出回管道。您还可以使用计算属性,例如 I have seen you do beforeAdd-Member
  • 您还创建了$domainNameThree = @{} 一个空的哈希表。可能无关紧要,但您将其视为数组,因此 $domainNameThree = @() 是有道理的。
  • 啊完美,谢谢马特。它完美地工作:)管道的通过是修复它的原因。另外,我必须在}};$_} | Export-Csv 中添加;。至于哈希与数组,我不确定哈希与数组是否也很重要,但我会对其进行更改并再次测试。无论如何,管道返回的缺失肯定是答案。再次感谢:)

标签: powershell powershell-3.0


【解决方案1】:

您从 我所拥有的不起作用的示例中显示的示例: 缺少一个关键部分。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多