Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сравнение 2 файлов (http://forum.oszone.net/showthread.php?t=321705)

Johny_spb 14-12-2016 11:28 2695558

Сравнение 2 файлов
 
Возникла необходимость сравнение 2 текстовых файлов и запись в третий файл данных из первого и второго. Кто может помогите, как это можно реализовать? PowerShell изучаю совсем не давно и таких навыков еще нет =( А теперь более подробно:
Есть 2 файла, в виде:
1. Файл
00005555;000000;Петров Петр Петрович
2. Файл
0000;0000;0000;0000;0000;0000;0000;0000;Петров Петр Петрович;PetrovPP

Необходимо следующее сравнить 2 файла построчно и при полном совпадении ФИО в 1 файле и ФИО во втором записать строку в третий файл совместив первое поле из первого файла и всю строку из второго в виде:

0000;0000;0000;0000;0000;0000;0000;0000;Петров Петр Петрович;PetrovPP;00005555

А при нахождении двух ФИО идентичных записать ошибку в отдельный файл с указанием ФИО.

Iska 14-12-2016 11:53 2695571

Цитата:

Цитата Johny_spb
Есть 2 файла, в виде: »

Желателен не вид, а архив с образцами файлов.

Цитата:

Цитата Johny_spb
сравнить 2 файла построчно »

Первую строку одного файла с первой строкой другого файла, вторую строку одного файла со второй строкой другого файла… и так далее?

Цитата:

Цитата Johny_spb
А при нахождении двух ФИО идентичных »

Это как? Где «нахождении»?

Johny_spb 14-12-2016 13:04 2695613

1 файл
Выгрузка из AD

Путь к утечке, Петров Петор Петрович,PetrovPP
Путь к утечке, Петров1 Петор Петрович,Petrov1PP
Путь к утечке, Петров2 Петор Петрович,Petrov2PP
и т.д. (более 500 пользователей)

2 файл
0000000001;99996; Петров Петор Петрович;Контора;Адрес;Телефон
0000000002;99997; Петров1 Петор Петрович;Контора;Адрес;Телефон
0000000003;99998; Петров2 Петор Петрович;Контора;Адрес;Телефон
и т.д. (более 500 пользователей)

В результате необходимо взять ФИО первого пользователя из 1 файла (Петров Петор Петрович) найти его во втором файле и первый параметр из строчки записать и так по всем пользователям. т.е. в результате должно получаться:
Путь к утечке, Петров Петор Петрович,PetrovPP,0000000001
Путь к утечке, Петров1 Петор Петрович,Petrov1PP,0000000002
Путь к утечке, Петров2 Петор Петрович,Petrov2PP,0000000003
и это записывается в 3 файл

А если идет полное совпадении записывается в отделенный файл как ошибка

Iska 14-12-2016 14:34 2695635

Johny_spb, повторю:
Цитата:

Цитата Iska
Желателен не вид, а архив с образцами файлов. »

«Секретные» данные, буде таковые, можете заменить.

Цитата:

Цитата Johny_spb
ФИО первого пользователя из 1 файла (Петров Петор Петрович) найти его во втором файле »

Ага, уже лучше. Имеем текстовую базу данных в первом приближении. Осталось разобраться с типом связи.

Цитата:

Цитата Johny_spb
А если идет полное совпадении записывается в отделенный файл как ошибка »

Что такое «полное совпадение»? Это никак не пояснило ситуацию с:
Цитата:

Цитата Johny_spb
А при нахождении двух ФИО идентичных записать ошибку в отдельный файл с указанием ФИО. »

Где «нахождение», где «идентичных»?

Короче говоря: выкладывайте архив с образцами исходных файлов, с результирующим файлом и с «отделенный файл как ошибка», которые должны получиться в итоге обработки.

Johny_spb 14-12-2016 15:40 2695649

Вложений: 1
  • doc.rar (777 bytes, скачиваний: 23)
Файлы во вложении. Спасибо!

Kazun 14-12-2016 20:31 2695742

Код:

$f1 = Import-Csv Фаил1.csv
$f2 = Import-Csv Фаил2.txt -Encoding Default -Header H1,H2,H3,H4,H5

$f2 | Foreach {$err = @()} {
        $r = $f1 -match "$($_.H3) $($_.H4) $($_.H5)"
        if($r.Count -eq 1) { $r[0].employeeNumber = $_.H1 }
        if($r.Count -gt 1) { $err += $r[0].displayName}
} {
        $err | Select -Uniq | Out-File error.txt
        $f1 | Export-Csv -NoType rezult.txt -Encoding Unicode
}


Johny_spb 15-12-2016 09:18 2695850

При попытке выполнить выдает ошибку =(

Import-Csv : Не удается найти параметр, соответствующий имени параметра "Encoding".
C:\Temp\scr.ps1:2 знак:33
+ $f2 = Import-Csv 2.txt -Encoding <<<< Default -Header H1,H2,H3,H4,H5
+ CategoryInfo : InvalidArgument: (:) [Import-Csv], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ImportCsvCommand

Johny_spb 15-12-2016 11:29 2695877

Еще заметил что при создании файла результата появляются лишние "" (двойные кавычки)
"DN","displayName","sAMAccountName","employeeNumber"
"CN=Petrov1PP,OU=40-Users,OU=St-Petersburg,DC=region,DC=cbr,DC=ru","Петров1 Петр Петрович","Petrov1PP",
"CN=Petrov2PP,OU=40-Users,OU=St-Petersburg,DC=region,DC=cbr,DC=ru","Петров2 Петр Петрович","Petrov2PP",

А необходимо:

DN,displayName,sAMAccountName,employeeNumber
"CN=Petrov1PP,OU=40-Users,OU=St-Petersburg,DC=region,DC=cbr,DC=ru",Петров1 Петр Петрович,Petrov1PP,
"CN=Petrov2PP,OU=40-Users,OU=St-Petersburg,DC=region,DC=cbr,DC=ru",Петров2 Петр Петрович,Petrov2PP,

Kazun 16-12-2016 14:12 2696171

Код:

$err = @()
$d = New-Object Collections.Specialized.OrderedDictionary

Get-Content Фаил1.csv | Foreach {
        $i = $_.split(",")[-2]
        if($d.Contains($i)) {
                $err += $i
        }
        else {
                $d.Add($i,$_)
        }
}

Get-Content Фаил2.txt | ConvertFrom-Csv -Header H1,H2,H3,H4,H5 | Group {"$($_.H3) $($_.H4) $($_.H5)"} | Foreach {
        $id = $_.Group[0].H1
        $name = $_.Name
        if($d["$name"]) {
                $d["$name"] = $d["$name"] + ",$id"
        }
}

$err | Out-File error.txt
$d.Values | Out-File rezult.txt



Время: 22:32.

Время: 22:32.
© OSzone.net 2001-