Как выбрать объекты, которые соответствуют определенному шаблону в PowerShell - PullRequest
1 голос
/ 30 сентября 2019

Так что для файла Excel CSV, я пытаюсь избавиться от всех дубликатов номеров компакт-дисков, которые имеют пустую ячейку в столбце AD, когда хотя бы один из номеров компакт-дисков имеет ячейку в столбце AD, который не является пустым(значения привет, я тоже), поэтому это должно выглядеть следующим образом.

Но я не хочу удалять дублирующиеся номера компакт-дисков, которые имеют в своих объявлениях один из них (привет, мне тоже) иЯ не хочу удалять один номер компакт-диска, независимо от того, имеет ли он пустую ячейку в столбце AD или (привет мне тоже) в AD в качестве значения.

Это то, что я опробовал в качестве сценария:

$GroupArray2 = @(
    'hi'
    'me'
    'to'
)
$items4 = Import-Csv -Path 'C:\Temp\Excel6.csv' | Group-object -Property 'AD' | Where-Object count -gt 1 | Where-object {$_.'AD' -in $GroupArray2} | Foreach-object { $selections3 = $_.Group | Select-Object -Property * }
$items4 | Export-CSv -path 'C:\Temp\Excel7.csv' -NoTypeInformation 

Но ничего не получится, когда я попробую. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Если я правильно понимаю вопрос, это должно сработать

$GroupArray2 = 'hi','me','too'

$result = Import-Csv -Path 'C:\Temp\Excel6.csv' | Group-object -Property 'CD' | ForEach-Object {
    if ($_.Count -gt 1) {
        # we've found multiple rows with same cd
        # get the items that have their AD set to one in the $GroupArray2 array
        $assigned = $_.Group | Where-object {$_.'AD' -in $GroupArray2}
        # get the items that have their AD set to nothing
        $notAssigned = $_.Group | Where-object {[string]::IsNullOrWhiteSpace($_.'AD')}
        # if we have both, return only the $assigned items, otherwise the entire group
        if (($assigned) -and ($notAssigned)) { $assigned } else { $_.Group }
    }
    else { 
        # single item, return whether is has an AD or not
        $_.Group
    }
}

$result | Export-Csv 'C:\Temp\Excel7.csv' -NoTypeInformation
0 голосов
/ 30 сентября 2019

Вам необходимо разделить объекты по группам, прежде чем проверять, где $_.'AD' -in $GroupArray2

$items4 = Import-Csv -Path 'C:\Temp\Excel6.csv' | Group-object -Property 'CD' | Where-Object count -gt 1 | ForEach-Object {$_.group}  | Where-object {$_.'AD' -in $GroupArray2}

Также обратите внимание, какой тип разделителя вы используете. Ваш образец CSV содержал запятые как часть строки, и это также разделитель по умолчанию. Используйте параметр -Delimiter Import-/Export-Csv, чтобы использовать другой символ:

$items4 = Import-Csv -Path $path -Delimiter ";" | Group-object -Property 'CD' | Where-Object count -gt 1 | ForEach-Object {$_.group}  | Where-object {$_.'AD' -in $GroupArray2} 
$items4 | Export-CSv -path 'C:\Temp\Excel7.csv' -NoTypeInformation -Delimiter ";"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...