Добавление результатов из объекта сравнения в массив - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть два сравниваемых файла, один CSV и один текстовый файл.CSV-файл содержит информацию о 5000 серверах, а txt-файл содержит только имена серверов около 3000.Столбцы в CSV: Имя, ОС и Тип.Вот что я сделал для сравнения объектов:

$compareObject = Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual

После этого мне дали три варианта.Те, которые находятся в обоих списках ==, те, которые только в текстовом файле =>, и те, которые только в CSV-файле =<.

Что я пытаюсь сделать, это взять.SideIndicator для значений, равных ==, и поместить это как столбец в $csvFile, чтобы я мог в конечном итоге сделать If ($csvFile.SideIndicator -eq "==")...

Так что в основном я пытаюсь выяснить, как написать:

If (($csvFile.Name -like $compareObject.InputObject) -and ($compareObject.InputObject -eq "==") {
    (add .SideIndicator to CSV file)
}

Я пытался поместить переменную $count++, где у меня в данный момент есть add .SideIndicator..., в мой скрипт, чтобы увидеть, сколько результатов возвращается, и он всегда возвращает 0.

Может кто-топомочь мне с этим или дать мне несколько идей?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Это может быть слишком сложно, но здесь вы идете:

Предположим, это ваш CSV-файл:

"Name","OS","Type"
"htew804","Windows","WindowsAutherServer"
"wddg9028","Windows","WindowsAutherServer"
"other321","Windows","WindowsBackupServer"

и это содержимое вашего текстового файла:

wddg9028
test1234
htew804

Тогда этот код:

$csvFile = 'D:\blah.csv'
$txtFile = 'D:\names.txt'

# import the .csv file
$csv = Import-Csv -Path $csvFile
# read the .txt file which contains only server names, each on a separate line
$txt = Get-Content -Path $txtFile

$items = Compare-Object -ReferenceObject $txt -DifferenceObject $csv.Name -IncludeEqual -PassThru 
$result = foreach ($item in $items) {
    $name = $item.ToString()
    switch ($item.SideIndicator) {
        '<='  { 
            # the servername is only present in the text file
            [PSCustomObject]@{
                Name = $name
                OS = ''
                Type = ''
                SideIndicator = $item.SideIndicator
                Comment = "Name only found in $txtFile"
            }
            break
        }
        default  { 
            # '==' AND '=>': the servername is only present in the csv file or in both files
            $server = @($csv | Where-Object { $_.Name -eq $name })[0]
            [PSCustomObject]@{
                Name = $server.Name
                OS = $server.OS
                Type = $server.Type
                SideIndicator = $item.SideIndicator
                Comment = if ($item.SideIndicator -eq '==') { "Name found in both files" } else { "Name only found in $csvFile" }
            }
        }
    }
}
$result | Format-Table -AutoSize

дает такой результат:

Name     OS      Type                SideIndicator Comment                        
----     --      ----                ------------- -------                        
wddg9028 Windows WindowsAutherServer ==            Name found in both files       
htew804  Windows WindowsAutherServer ==            Name found in both files       
other321 Windows WindowsBackupServer =>            Name only found in D:\blah.csv 
test1234                             <=            Name only found in D:\names.txt

Если вы хотите, чтобы эта информация была записана в новый CSVфайл, измените Format-Table -AutoSize на Export-Csv -Path 'D:\blah_updated.csv' -NoTypeInformation

0 голосов
/ 20 декабря 2018
  • Взятие примеров файлов Тео , но импорт обоих файлов (текстовый файл с -Header Name)
  • и Razorfen * -PassThru подход,
  • плюс изменение порядка, чтобы иметь файл CSV как -Reference

Это так просто:

$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name

Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual -PassThru

, чтобы получить это желаемоевывод:

Name     OS      Type                SideIndicator
----     --      ----                -------------
wddg9028 Windows WindowsAutherServer ==
htew804  Windows WindowsAutherServer ==
test1234                             =>
other321 Windows WindowsBackupServer <=

Таким образом, оба получают +1 от меня.

0 голосов
/ 20 декабря 2018

Вы хотите передать результаты Compare-Object, чтобы завершить фильтрацию SideIndicator следующим образом:

$fields = "name", "street", "zip", "city"
Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual -Property $fields -PassThru | Where-Object {
    $_.SideIndicator -eq "=="
} | Select-Object $fields | Export-Csv ".\output.csv" -NoTypeInformation

Где $fields содержит ваши CSV-заголовки

...