Конкретное соответствие между двумя файлами CSV - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть два CSV-файла, например:

CSV1:

Name
test;
test & example;
test & example & testagain;

CSV2:

Name
test1;
test&example;
test & example&testagain;

Я хочу сравнить каждую строку CSV1 с каждой строкойCSV2 и, если первые 5 букв совпадают, напишите результат.

Я могу сравнить их, но только если они идеально совпадают:

$CSV1 = Import-Csv -Path ".\client.csv" -Delimiter ";"
$CSV2 = Import-Csv ".\client1.csv" -Delimiter ";"

foreach ($record in $CSV1) {
    $result = $CSV2 | Where {$_.name -like $record.name}
    $result
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019
foreach ($record in $CSV1) {
    $CSV2 | Where {"$($_.name)12345".SubString(0, 5) -eq "$($record.name)12345".SubString(0, 5)} |
        ForEach {[PSCustomObject]@{Name1 = $Record.Name; Name2 = $_.Name}}
}

или:

... | Where {($_.name[0..4] -Join '') -eq ($record.name[0..4] -Join '')} | ...

Используя этот Join-Object командлет:

$CSV1 | Join $CSV2 `
    -Using {($Left.name[0..4] -Join '') -eq ($Right.name[0..4] -Join '')} `
    -Property @{Name1 = {$Left.Name}; Name2 = {$Right.Name}}

Все вышеперечисленные результаты в:

Name1                       Name2
-----                       -----
test & example;             test & example&testagain;
test & example & testagain; test & example&testagain;
0 голосов
/ 10 февраля 2019

Это можно сделать с помощью Compare-Object и определения пользовательского свойства.

Compare-Object $CSV1 $CSV2 -Property {$_.name -replace '^(.{5}).*', '$1'} -PassThru

$_.name -replace '^(.{5}).*', '$1' будет принимать первые 5 символов из свойства name (или меньше, если строка короче, чем5 символов) и удалите остальное.Это свойство затем используется для сравнения записей из $CSV1 и $CSV2.Параметр -PassThru заставляет командлет выдавать исходные данные, а не объекты только с пользовательским свойством.Теоретически вы можете использовать $_.name.Substring(0, 5) вместо замены регулярного выражения для извлечения первых 5 символов.Однако это приведет к ошибке, если имя будет короче 5 символов, как в первой записи из $CSV1.

По умолчанию Compare-Object выводит различия между входными объектами, поэтому вам также необходимо добавитьпараметры -IncludeEqual и -ExcludeDifferent для получения только соответствующих записей.

Передайте результат через Select-Object * -Exclude SideIndicator, чтобы удалить свойство SideIndicator из вывода.

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