Powershell сравнивает 2 CSV-файла и удаляет дубликаты из первого, каждый из которых имеет разные заголовки - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть 2 файла CSV, первый содержит заголовки

Name,Email,OfficePhone
Bill,Bill@jump.com,123-456-7890

второй содержит только:

primaryEmail
Bill@jump.com

Я хотел бы сравнить 2 и удалить все дубликаты строки в первом, если это письмо существует во втором. Я пытаюсь использовать объект сравнения, но не уверен, где отсюда go.

$File1 = Import-Csv C:\it\newuser.csv
$File2 = Import-Csv C:\it\email.csv


Compare-Object $File1 $File2 -Property email

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Полезный ответ RoadRunner предлагает эффективное решение.

Однако при больших наборах ввода производительность может стать проблемой , поскольку линейный поиск в массиве электронной почты адреса ($csv2) выполняются для каждой входной строки CSV .

Использование System.Collections.Generic.HashSet<T> предлагает решение, поскольку поиск в наборах ha sh согласован fast.

Метод System.Linq.Enumerable.ToHashSet предлагает удобный способ создания такого набора ha sh из объекта, реализующего System.Collections.Generic.IEnumerable<T>, такого как массив .

# Build a case-insensitive hash set of email addresses from $File2 
# whose elements are to be excluded from $File1.
# Note that the cast to [string[]] is required in order for PowerShell
# to find the right generic method overload.
$refEmailsHashSet = [Linq.Enumerable]::ToHashSet(
  [string[]] (Import-Csv $File2).primaryEmail,
  [StringComparer]::CurrentCultureIgnoreCase
)

# Import $File1 and filter out the email addresses from $File2
# Pipe to `Export-Csv -NoTypeInformation -Encoding ...` to save to a new CSV file.
Import-Csv $File1 | Where-Object { -not $refEmailsHashSet.Contains($_.Email) }
1 голос
/ 08 апреля 2020

Самый простой способ - это, вероятно, просто извлечь первичные электронные письма сначала из 2-го CSV, а затем использовать Where-Object, чтобы отфильтровать дублирующиеся строки с дублирующимися электронными письмами из 1-го CSV.

# Get primary emails from 2nd CSV
$csv2 = (Import-Csv -Path .\2.csv).primaryEmail

# Remove rows from 1st csv that don't have an email in $csv2
$removedDuplicateRows = Import-Csv -Path .\1.csv | Where-Object {$_.Email -notin $csv2}

# Export filtered rows into output.csv
$removedDuplicateRows | Export-Csv -Path .\output.csv -NoTypeInformation

Если вы используете PowerShell 7 , вы можете использовать -UseQuotes Never из Export-Csv, чтобы не включать кавычки в выходной CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...