сравните значение заголовка между двумя CSV-файлами, если совпадение найдено, затем добавьте столбец с соответствующим значением с помощью powershell - PullRequest
0 голосов
/ 05 августа 2020

Я видел такие сообщения, но не смог получить точный рабочий модуль. Я надеюсь, что кто-то может мне в этом помочь.

У меня есть два файла .CSV

file1.csv

«ID», «status», «Тип»

«mzx1», «Активный», «A»

«mzx2», «Активный», «B»

«mzx3», «Активный» , "C"

file2.csv

«ID», «Пользовательская компания», «Дата»

«mzx1», » MS »,« 2020-01-01 »

« mzx3 »,« Sam »,« 020-01-01 »

« mzx5 »,« new »,« 020-01- » 03 "

Мне нужно сравнить значение идентификатора в файле file2.csv , если оно совпадает, а затем добавить столбец со значением« Компания пользователя »

file3. csv

«ID», «статус», «Тип», «Компания»

«mzx1», «Активный», «A», «MS»

«mzx2», «Active», «B», «Not found»

«mzx3», «Active», «C», «Sam»

Теперь, если вы см. пример файла file3.csv , который содержит все строки файла file1.csv и новый столбец «Компания». Также, если совпадение идентификаторов не найдено, должно быть указано «Не найдено».

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Вы можете использовать вычисляемое свойство с Select-Object в этом решении PowerShell v4 +:

$file1 = Import-Csv file1.csv
$file2 = Import-Csv file2.csv
$file3 = foreach ($row in $file1) {
    $lookup = $file2.Where({$_.ID -eq $row.ID},'First')
    $row | Select *,@{n='Company';e={if ($lookup) { $lookup.'User Company' } else { 'Not Found'}}}
}
$file3 | Export-Csv file3.csv -NoType
0 голосов
/ 06 августа 2020

Вы также можете использовать свойство -AsHashTable объекта Group-Object для создания таблицы поиска и объединения с вычисляемыми свойствами.

$file1 = @'
"ID","status","Type"
"mzx1","Active","A"
"mzx2","Active","B"
"mzx3","Active","C"
'@ | ConvertFrom-Csv

$file2 = @'
"ID","User Company","Date"
"mzx1","MS","2020-01-01"
"mzx3","Sam","020-01-01"
"mzx5","new","020-01-03"
'@ | ConvertFrom-Csv | group -Property id -AsHashTable

$file1 | select *,@{n='Company';e={$(if($file2[$_.id]){$file2[$_.id].'User Company'}else{'Not Found'})}}

Ожидаемый результат

ID   status Type Company  
--   ------ ---- -------  
mzx1 Active A    MS       
mzx2 Active B    Not Found
mzx3 Active C    Sam    

Может выглядеть лот аккуратнее

$file1 = @'
"ID","status","Type"
"mzx1","Active","A"
"mzx2","Active","B"
"mzx3","Active","C"
'@ | ConvertFrom-Csv

$file2 = @'
"ID","User Company","Date"
"mzx1","MS","2020-01-01"
"mzx3","Sam","020-01-01"
"mzx5","new","020-01-03"
'@| ConvertFrom-Csv | group -Property id -AsHashTable

$company = {
    Param($ID)

    $out = $file2[$ID].'User Company'
    if($out){$out} else {'Not Found'}
}

$file1 | select *,@{n='Company';e={& $company $_.id}} | Export-Csv $file3 -NoTypeInformation
0 голосов
/ 05 августа 2020

В этом примере показано, как добавить свойство к переменной csv $ file1:

$file1 = @'
"ID","status","Type"
"mzx1","Active","A"
"mzx2","Active","B"
"mzx3","Active","C"
'@ | ConvertFrom-Csv

$file2 = @'
"ID","User Company","Date"
"mzx1","MS","2020-01-01"
"mzx3","Sam","020-01-01"
"mzx5","new","020-01-03"
'@| ConvertFrom-Csv


foreach($l in $file1){
    $l2 = $file2 | Where { $_.ID -eq $l.ID }
    if ($l2 )
    {
        $l | Add-Member -MemberType NoteProperty -Name 'User Company' -Value $l2.'User Company'
    }
    else
    {
        $l | Add-Member -MemberType NoteProperty -Name 'User Company' -Value 'Not found'
    }
}
$file1
...