使用一个属性比较两个CSV来比较另一个

sha*_*020 1 powershell cmd

文件1

"FACILITY","FILENAME"
"16","abc.txt"
"16","def.txt"
"12","abc.txt"
"17","def.txt"
"18","abc.txt"
"19","abc.txt"
Run Code Online (Sandbox Code Playgroud)

文件2

"FACILITY","FILENAME"
"16","jkl.txt"
"16","abc.txt"
"12","abc.txt"
"17","jkl.txt"
"18","jkl.txt"
"19","jkl.txt"
Run Code Online (Sandbox Code Playgroud)

我正在寻找此输出:

"FACILITY","FILENAME"
"16","abc.txt"
"12","abc.txt"
Run Code Online (Sandbox Code Playgroud)

对于File2中的每个FILENAME,我想按设施列出文件名是否在File1中。因此,如果在File1的FACILITY 20旁边列出了文件qwerty.txt,并且将File2中的FILENAME与文件名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
Run Code Online (Sandbox Code Playgroud)

我已经看到了很多例子,该如何比较两个列表,但是我需要比较一个基于另一个属性的属性,这就是为什么我一直在努力地仅通过Google搜索答案。

The*_*ian 5

Property参数接受一个数组,因此只需指定两个属性即可:

Compare-Object $file1 $file2 -Property 'Facility','Filename' -IncludeEqual -ExcludeDifferent -PassThru|select * -Exclude SideIndicator|export-csv -notype $scriptpath\test.csv
Run Code Online (Sandbox Code Playgroud)

这是我测试的方式,我从重新创建源数据开始(我没有创建文件,只是复制您的文本并使用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
Run Code Online (Sandbox Code Playgroud)

然后,我只使用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  <=           
Run Code Online (Sandbox Code Playgroud)

从那开始,我排除了差异,并包括了相同之处,然后将其发送到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 
Run Code Online (Sandbox Code Playgroud)

看到输出就是您想要的,我只是建议将Export-Csv其输出到文件。这一切对我来说都很好,因此,如果对您不起作用,则可以检查源文件并确保列标题相同,或者文件中的数据格式是否稍有不同(例如完整路径与文件名或东西)。