我目前有两个完整的名称数组。一种包含从txt文件读入的数据,另一种包含从CSV文件读入的数据。 我正试图返回出现在两个列表中并且仅出现在单个列表中的名称列表。对于CSV文件,PowerShell最初想将"Name="
放在每个项目的前面,但我使用$formattedName = $csvFile -replace "Name=",""
摆脱了它。我还应该提到Name
是该列的标题。在这一点上,如果我调用变量$formattedName
,它将返回在它们前面没有Name=
的名称列表(也就是txt的格式如何比较)。
现在,当尝试使用Compare-Object
时,我遇到了一个问题。我的代码显示为:
Compare-Object -ReferenceObject $txtFile -DifferenceObject $formattedName -IncludeEqual
现在,在运行此命令时,PowerShell仍将Name=
放在CSV文件的每个项目的前面,无论我是否格式化它都没有这样做。我的最终结果是两个列表,一个包含txt文件中的所有项目,另一个包含CSV文件中的所有项目。由于Steven
与Name=Steven
不同,因此没有两个匹配的值。输出示例为:
Steven =>
Name=Steven <=
我该如何解决这个问题?我使用得当吗?
答案 0 :(得分:0)
在没有适当的CSV文件和文本文件示例的情况下,根据您的问题,我认为我可以确定您的CSV看起来像这样:
"Surname","Name"
"Seagal","Steven"
"Rambo","John"
"Schwarzenegger","Arnold"
看看您显示的输出,我收集到的文本文件只是一堆(名字),每个名字都在这样的单独一行上:
Steven
Sylvester
John
为了比较它们,您只需要从CSV文件中过滤掉Name
列,因此它将与您从文本文件中读取的数组匹配。
(您必须说“ 我还应该提到Name是该列的标题。”)
然后尝试:
# import the .csv file and extract only the 'Name' column from it as string array
$csv = (Import-Csv -Path "D:\blah.csv").Name
# read the .txt file which apparently contains only firstnames, each on a separate line
$txt = Get-Content -Path "D:\names.txt"
Compare-Object -ReferenceObject $txt -DifferenceObject $csv -IncludeEqual
在我提供的示例文件中运行此命令,输出为:
InputObject SideIndicator
----------- -------------
Steven ==
John ==
Arnold =>
Sylvester <=
哪里