Проблема с вычитанием массива в Powershell - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть два CSV следующим образом:

A
20180809000
20180809555
20180809666
20180809777
20180809888

File2:

A
20180809000
20180809555
20180809666
20180809777

Я хочу найти разницу между File1 - File2, которая должна выдавать 20180809888.Я пробовал следующее:

$a1= Import-Csv -Path $file1 | select A

$a2 = Import-Csv -Path $file2 | select A

$a1| where {$a2 -notcontains $_}  

Но он выводит весь файл 1:

A
--------------                                                                                                                       
20180809000                                                                                                                          
20180809555                                                                                                                          
20180809666                                                                                                                          
20180809777                                                                                                                          
20180809888   

Я также пробовал пересечение, но это выводит ноль.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

select A по-прежнему будет возвращать объект со свойством с именем A.

# Returns an object list with property A
Import-Csv -Path $file | select A # (shorthand for Select-Object -Property A)
# A
# ---
# value1
# value2
# ...

. Вы можете получить массив значений свойства A, используя точечную нотацию, например:

# Returns the list of values of the A property
(Import-Csv -Path $file).A
# value1
# value2
# ...

Должно работать следующее:

$a1= (Import-Csv -Path $file1).A
$a2 = (Import-Csv -Path $file2).A
$a1 | where {$a2 -notcontains $_}  
0 голосов
/ 08 февраля 2019

Самое простое решение - использовать:

> Compare-Object (Get-Content .\File1.csv) (Get-Content .\File2.csv) -PassThru
20180809888

Или использовать Import-Csv

> Compare-Object (Import-Csv .\File1.csv).A (Import-Csv .\File2.csv).A -Passthru
20180809888

Или

> (Compare-Object (Import-Csv .\File1.csv) (Import-Csv .\File2.csv) -Passthru).A
20180809888
0 голосов
/ 08 февраля 2019

Ваша последняя строка должна быть следующей:

$a1.A.where{$_ -notin $a2.A}

Чтобы сохранить столбец, вы можете сделать следующее для последней строки:

$a1.where{$_.A -notin $a2.A}

Проблема в этой ситуациичто если второй файл имеет больше данных, чем первый файл.Тогда вам нужно будет сделать что-то подобное для вашей последней строки:

$a1 | compare $a2 | select -expand inputobject
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...