Сравнение двух CSV, использующих одно свойство для сравнения другого - PullRequest
1 голос
/ 10 апреля 2019

File1

"FACILITY","FILENAME"
"16","abc.txt"
"16","def.txt"
"12","abc.txt"
"17","def.txt"
"18","abc.txt"
"19","abc.txt"

File2

"FACILITY","FILENAME"
"16","jkl.txt"
"16","abc.txt"
"12","abc.txt"
"17","jkl.txt"
"18","jkl.txt"
"19","jkl.txt"

Я ищу этот вывод:

"FACILITY","FILENAME"
"16","abc.txt"
"12","abc.txt"

Для каждого FILENAME в File2 я хотел бысписок, если имя файла в File1 на на основе FACILITY .Поэтому, если рядом с FACILITY 20 в файле File1 указан файл qwerty.txt, и он совпадает с именем файла FILENAME в файле File2 с именем файла qwerty.txt в той же строке, выведите вывод.

Допустим, есть файл qwerty.txt для разных объектов, я не хочу, чтобы это было в моих выходных данных.

Вот кое-что, что я пробовал, но мне кажется, что я убилкоманды, потому что я не совсем понимаю их.

$file1 = Import-Csv $scriptPath'\loadedfiles.txt' -Delimiter ','
$file2 = Import-Csv $scriptPath'\filenames.txt' -Delimiter ','

$Header = $file1 | Get-Member | Where-Object -FilterScript {$_.MemberType -eq 'FACILITY'} | Select-Object -ExpandProperty FILENAME

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -Property 'FILENAME' -PassThru | Select-Object -Property $Header |
Export-Csv -Path $scriptPath\test.csv -NoTypeInformation

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

1 Ответ

5 голосов
/ 10 апреля 2019

Параметр Property принимает массив, поэтому просто укажите оба свойства:

Compare-Object $file1 $file2 -Property 'Facility','Filename' -IncludeEqual -ExcludeDifferent -PassThru|select * -Exclude SideIndicator|export-csv -notype $scriptpath\test.csv

Вот как я тестировал, я начал с воссоздания исходных данных (я не создавал файлы, просто скопировал ваш текст ииспользовал convertfrom-csv, но это должно быть то же самое):

PS C:\Users\TMTech> $file1='"FACILITY","FILENAME"
"16","abc.txt"
"16","def.txt"
"12","abc.txt"
"17","def.txt"
"18","abc.txt"
"19","abc.txt"'|convertfrom-csv

PS C:\Users\TMTech> $file2='"FACILITY","FILENAME"
"16","jkl.txt"
"16","abc.txt"
"12","abc.txt"
"17","jkl.txt"
"18","jkl.txt"
"19","jkl.txt"'|convertfrom-csv

Затем я использовал Compare-Object только с некоторыми основными параметрами:

PS C:\Users\TMTech> Compare-Object $file1 $file2 -Property 'Facility','Filename'

Facility Filename SideIndicator
-------- -------- -------------
16       jkl.txt  =>           
17       jkl.txt  =>           
18       jkl.txt  =>           
19       jkl.txt  =>           
16       def.txt  <=           
17       def.txt  <=           
18       abc.txt  <=           
19       abc.txt  <=           

Из этого я исключил различия,и включил, где это было то же самое, и отправил его в Select-Object, чтобы удалить свойство SideIndicator, которое добавляется Compare-Object:

PS C:\Users\TMTech> Compare-Object $file1 $file2 -Property 'Facility','Filename' -IncludeEqual -ExcludeDifferent -PassThru|select * -exclude sideindicator

FACILITY FILENAME
-------- --------
16       abc.txt 
12       abc.txt 

Видя, что вывод является тем, что вы хотели, я просто предложил трубкуна Export-Csv чтобы вывести его в файл.Для меня все это работало нормально, поэтому, если это не работает для вас, возможно, проверьте исходные файлы и убедитесь, что заголовки столбцов идентичны, или что данные не отформатированы в файлах немного по-другому (например, полный путь или имя файла иличто-то).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...