-1

我目前有两个满是名字的数组。一个包含从 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 <=

我该如何解决这个问题?我使用得当吗?

4

1 回答 1

0

如果没有 CSV 文件和文本文件的适当示例,从您的问题中我想我可以看出您的 CSV 看起来像这样:

"Surname","Name"
"Seagal","Steven"
"Rambo","John"
"Schwarzenegger","Arnold"

查看您显示的输出,我收集文本文件只是一堆(名字)名称,每个名称都在单独的行中,如下所示:

Steven
Sylvester
John

为了比较它们,您只需Name要从 CSV 文件中过滤掉该列,因此它将与您从文本文件中读取的数组匹配。(您确实说“我还应该提到 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   <=  

在哪里

  • 'Steven' 和 'John' 出现在两个文件中,
  • 'Arnold' 仅在 CSV 文件中找到,并且
  • 'Sylvester' 在文本文件中,但不在 CSV 文件中。
于 2018-12-15T11:56:40.040 回答