Файл1
"FACILITY","FILENAME"
"16","abc.txt"
"16","def.txt"
"12","abc.txt"
"17","def.txt"
"18","abc.txt"
"19","abc.txt"
Файл2
"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 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.
Это создает файл с нулевым байтом для меня. Я поиграю с этим, хотя.
Как насчет findstr /LIXG:"File1.txt" "File2.txt"
в командной строке Windows (cmd
)?
@aschipfl Это одинаково хорошо подходит для сравнения всей строки, в отличие от заголовка OP, он хочет сравнить оба свойства / столбца.
$file1 | Join $file2 -On Facility, Filename
как описано здесь: stackoverflow.com/a/45483110/1701026 имеет более простой синтаксис и несколько дополнительных включенных функций (объединения) и значений по умолчанию. К сожалению, он не достигает производительности командлета Compare-Object
...
Параметр 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
, чтобы вывести его в файл. У меня все это работало нормально, поэтому, если это не работает для вас, возможно, проверьте свои исходные файлы и убедитесь, что заголовки столбцов идентичны или что данные в файлах не отформатированы немного иначе (например, полный путь и имя файла или что-то).
Как именно это должно быть сделано и хорошо объяснено (+1)
Параметр
Property
принимает массив, поэтому просто укажите оба свойства:Compare-Object $file1 $file2 -Property 'Facility','Filename' -IncludeEqual -ExcludeDifferent -PassThru|select * -Exclude SideIndicator|export-csv -notype $scriptpath\test.csv