Powershell:查找值并将值附加到两个表和两个 csv 文件之间的列
Powershell: Finding and appending values to columns between two has tables and two csv files
我将尝试简单地打破这个...
问题描述
2 个 csv 文件(目标文件的字段由其他 csv 文件自动填充)
我有一个包含 3 行的源 csv 文件,其中包含:
sourceColumn1,sourceColumn2,sourceColumn3,sourceColumn4,sourceColumn5,sourceColumn6,sourceColumn7 ,sourceColumn8 ,sourceColumn9,sourceColumn10,sourceColumn11,sourceColumn12,sourceColumn13,sourceColumn14,sourceColumn15,sourceColumn16
sourceValue1 ,value2a ,value3a ,value4a ,value5a , ,value7a ,sourceValueFound1,value9a , , ,value12a , , , ,
value1b ,value2b ,value3b ,value4b ,value5b ,sourceValue2 , ,sourceValueFound2,value9b , , , ,value13b , , ,
value1c , ,value3c ,value4c ,value5c ,sourceValue3 , ,sourceValueFound3,value9c , , , , , ,sourceValue3 ,
我有一个目标 csv 文件(在代码为 运行 之前),其中包含 3 行:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound"
最终目标
我想在目标文件中添加一列 destinationColumn7
,其中包含源文件中 sourceColumn8
中的 where(values -ne $null)。
通过从源文件中找到 sourceValue#
并将其与目标文件中的 sourceValue#
匹配来匹配正确的值。
因此目标文件应如下所示:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"sourceValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"sourceValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","sourceValueFound3"
到目前为止我尝试了什么
为此,我使用以下代码...
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If ($FirstHashTable.ContainsKey($_.destinationColumn4)){
$FirstHashTable[$_.destinationColumn4]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn5)){
$FirstHashTable[$_.destinationColumn5]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn1)){
$FirstHashTable[$_.destinationColumn1]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp" -NoType
Move-Item "$destinationCsvFile-Temp" $destinationCsvFile -Force
Write-Host "Complete."
目标文件的结果:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"sourceValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"No SourceValueFound"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","No SourceValueFound"
正如我们所见,这并没有在 destinationColumn7
下附加最后 2 行 sourceValueFound#
。相反,它们是 No SourceValueFound
.
接下来我注意到 sourceValue#
在源文件的不同列中,而 sourceValueFound#
不是 $null
所以我修改了代码...
$sourceCsvFile = 'C:\Temp\test1.csv'
$destinationCsvFile = 'C:\Temp\test2.csv'
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Creating hash table with columns `"sourceColumn6`" and `"sourceColumn8`" From $sourceCsvFile"
$SecondHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$SecondHashTable[$_.sourceColumn6] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}
}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If (($FirstHashTable.ContainsKey($_.destinationColumn4)) -and ($FirstHashTable.ContainsKey($_.destinationColumn4) -ne 'No SourceValueFound')) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn5)) -and ($FirstHashTable.ContainsKey($_.destinationColumn5) -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn5]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn2)) -and ($FirstHashTable.ContainsKey($_.destinationColumn2) -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn2]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn4)){
$SecondHashTable[$_.destinationColumn4]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn5)){
$SecondHashTable[$_.destinationColumn5]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn2)){
$SecondHashTable[$_.destinationColumn2]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp.csv" -NoType
Write-Host "Complete."
目标文件的结果:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"No SourceValueFound"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"sourceValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","No SourceValueFound"
现在它在目标文件的第 2 行添加 sourceValueFound#
,但第 3 行仍然是 No SourceValueFound
for destinationColumn7
。
任何能帮我填写我所缺少的内容的人将不胜感激。
我找到了答案,我没有跳过包含 'No SourceValueFound'
值的键,因为我使用的是 ($FirstHashTable.ContainsKey($_.destinationColumn4) -ne 'No SourceValueFound')
而不是 ($FirstHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')
然后我必须将此添加到其他 3 个 ElseIf 语句以确保首先检查所有非 'No SourceValueFound'
值,然后再确保 'No SourceValueFound'
是正确的。
$sourceCsvFile = 'C:\Temp\test1.csv'
$destinationCsvFile = 'C:\Temp\test2.csv'
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Creating hash table with columns `"sourceColumn6`" and `"sourceColumn8`" From $sourceCsvFile"
$SecondHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$SecondHashTable[$_.sourceColumn6] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If (($FirstHashTable.ContainsKey($_.destinationColumn4)) -and ($FirstHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn5)) -and ($FirstHashTable[$_.destinationColumn5] -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn5]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn2)) -and ($FirstHashTable[$_.destinationColumn2] -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn2]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn4)) -and ($SecondHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn4]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn5)) -and ($SecondHashTable[$_.destinationColumn5] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn5]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn2)) -and ($SecondHashTable[$_.destinationColumn2] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn2]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn4)) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn5)){
$FirstHashTable[$_.destinationColumn5]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn2)){
$FirstHashTable[$_.destinationColumn2]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp.csv" -NoType
Write-Host "Complete."
现在工作...
我将尝试简单地打破这个...
问题描述
2 个 csv 文件(目标文件的字段由其他 csv 文件自动填充)
我有一个包含 3 行的源 csv 文件,其中包含:
sourceColumn1,sourceColumn2,sourceColumn3,sourceColumn4,sourceColumn5,sourceColumn6,sourceColumn7 ,sourceColumn8 ,sourceColumn9,sourceColumn10,sourceColumn11,sourceColumn12,sourceColumn13,sourceColumn14,sourceColumn15,sourceColumn16
sourceValue1 ,value2a ,value3a ,value4a ,value5a , ,value7a ,sourceValueFound1,value9a , , ,value12a , , , ,
value1b ,value2b ,value3b ,value4b ,value5b ,sourceValue2 , ,sourceValueFound2,value9b , , , ,value13b , , ,
value1c , ,value3c ,value4c ,value5c ,sourceValue3 , ,sourceValueFound3,value9c , , , , , ,sourceValue3 ,
我有一个目标 csv 文件(在代码为 运行 之前),其中包含 3 行:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound"
最终目标
我想在目标文件中添加一列 destinationColumn7
,其中包含源文件中 sourceColumn8
中的 where(values -ne $null)。
通过从源文件中找到 sourceValue#
并将其与目标文件中的 sourceValue#
匹配来匹配正确的值。
因此目标文件应如下所示:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"sourceValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"sourceValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","sourceValueFound3"
到目前为止我尝试了什么
为此,我使用以下代码...
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If ($FirstHashTable.ContainsKey($_.destinationColumn4)){
$FirstHashTable[$_.destinationColumn4]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn5)){
$FirstHashTable[$_.destinationColumn5]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn1)){
$FirstHashTable[$_.destinationColumn1]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp" -NoType
Move-Item "$destinationCsvFile-Temp" $destinationCsvFile -Force
Write-Host "Complete."
目标文件的结果:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"sourceValueFound1"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"No SourceValueFound"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","No SourceValueFound"
正如我们所见,这并没有在 destinationColumn7
下附加最后 2 行 sourceValueFound#
。相反,它们是 No SourceValueFound
.
接下来我注意到 sourceValue#
在源文件的不同列中,而 sourceValueFound#
不是 $null
所以我修改了代码...
$sourceCsvFile = 'C:\Temp\test1.csv'
$destinationCsvFile = 'C:\Temp\test2.csv'
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Creating hash table with columns `"sourceColumn6`" and `"sourceColumn8`" From $sourceCsvFile"
$SecondHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$SecondHashTable[$_.sourceColumn6] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}
}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If (($FirstHashTable.ContainsKey($_.destinationColumn4)) -and ($FirstHashTable.ContainsKey($_.destinationColumn4) -ne 'No SourceValueFound')) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn5)) -and ($FirstHashTable.ContainsKey($_.destinationColumn5) -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn5]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn2)) -and ($FirstHashTable.ContainsKey($_.destinationColumn2) -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn2]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn4)){
$SecondHashTable[$_.destinationColumn4]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn5)){
$SecondHashTable[$_.destinationColumn5]
} ElseIf ($SecondHashTable.ContainsKey($_.destinationColumn2)){
$SecondHashTable[$_.destinationColumn2]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp.csv" -NoType
Write-Host "Complete."
目标文件的结果:
"destinationColumn1","destinationColumn2","destinationColumn3","destinationColumn4","destinationColumn5","destinationColumn6" ,"destinationColumn7"
"value1aa" ,"value2aa" ,"value3aa" ,"sourceValue1" ,"value5aa" ,"AdValueFound1" ,"No SourceValueFound"
"value1bb" ,"sourceValue2" ,"value3bb" ,"value4bb" ,"sourceValue2" ,"AdValueFound2" ,"sourceValueFound2"
"value1cc" ,"sourceValue3" ,"value3cc" ,"value4cc" ,"value5cc" ,"No SourceValueFound","No SourceValueFound"
现在它在目标文件的第 2 行添加 sourceValueFound#
,但第 3 行仍然是 No SourceValueFound
for destinationColumn7
。
任何能帮我填写我所缺少的内容的人将不胜感激。
我找到了答案,我没有跳过包含 'No SourceValueFound'
值的键,因为我使用的是 ($FirstHashTable.ContainsKey($_.destinationColumn4) -ne 'No SourceValueFound')
而不是 ($FirstHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')
然后我必须将此添加到其他 3 个 ElseIf 语句以确保首先检查所有非 'No SourceValueFound'
值,然后再确保 'No SourceValueFound'
是正确的。
$sourceCsvFile = 'C:\Temp\test1.csv'
$destinationCsvFile = 'C:\Temp\test2.csv'
Write-Host "Creating hash table with columns `"sourceColumn1`" and `"sourceColumn8`" From $sourceCsvFile"
$FirstHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$FirstHashTable[$_.sourceColumn1] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Creating hash table with columns `"sourceColumn6`" and `"sourceColumn8`" From $sourceCsvFile"
$SecondHashTable = @{}
Import-Csv $sourceCsvFile | ForEach-Object {
$SecondHashTable[$_.sourceColumn6] = If ($_.sourceColumn8) {$_.sourceColumn8} Else {'No SourceValueFound'}}
Write-Host "Complete."
Write-Host "Appending new destinationColumn7 column from hash table"
(Import-Csv $destinationCsvFile) |
Select-Object -Property *, @{n='destinationColumn7';e={
If (($FirstHashTable.ContainsKey($_.destinationColumn4)) -and ($FirstHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn5)) -and ($FirstHashTable[$_.destinationColumn5] -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn5]
} ElseIf (($FirstHashTable.ContainsKey($_.destinationColumn2)) -and ($FirstHashTable[$_.destinationColumn2] -ne 'No SourceValueFound')){
$FirstHashTable[$_.destinationColumn2]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn4)) -and ($SecondHashTable[$_.destinationColumn4] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn4]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn5)) -and ($SecondHashTable[$_.destinationColumn5] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn5]
} ElseIf (($SecondHashTable.ContainsKey($_.destinationColumn2)) -and ($SecondHashTable[$_.destinationColumn2] -ne 'No SourceValueFound')){
$SecondHashTable[$_.destinationColumn2]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn4)) {
$FirstHashTable[$_.destinationColumn4]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn5)){
$FirstHashTable[$_.destinationColumn5]
} ElseIf ($FirstHashTable.ContainsKey($_.destinationColumn2)){
$FirstHashTable[$_.destinationColumn2]
} Else {
'No MatchFound'
}}} | Export-Csv "$destinationCsvFile-Temp.csv" -NoType
Write-Host "Complete."
现在工作...