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

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

dosperados 19-01-2012 14:24 1839575

Сравнение содержимого двух CSV файлов
 
Задача такая - есть два файла:
new.csv в котором содержится
Цитата:

#TYPE System.Management.Automation.PSCustomObject
"Name","Mail"
"Петров П.П.","p.petrov@company.ru"
"Иванов И.И.","i.ivaniv@company.ru"
"Сидоров Семен.С.","s.sidorov@company.ru"
и второй файл old.csv:
Цитата:

#TYPE System.Management.Automation.PSCustomObject
"Name","Mail"
"Петров П.П.","p.petrov@company.ru"
"Редькин Р.Р.","r.redkin@company.ru"
"Сидоров С.С.","s.sidorov@company.ru"
"Гейтс С.С.","s.gey@company.ru"
Необходимо сравнить эти два файла и получить все различия.
т.е. в фейле new нет Гейтс С.С. и Редькин Р.Р и Сидоров С.С значит эти два объекта с их значениями должны попасть в массив $del
а в файле old нет Иванов И.И. и Сидоров Семен.С. значит эти два объекта с их значениями должны попасть в массив $new
Проверятся должны не только параметр "Name" но также и параметр "Mail" (если у Петров П.П. поменялась бы почта на ,"PP.petrov@company.ru", то Петров П.П. со старой почтой попал бы в массив $del, а Петров с новой почтой попал бы в массив $new)

Пытался использовать встроенный Cmdlet Compare-Object, но Compare-Object вообще как то непонятно проводит сравнение, возможно им вообще не получится это сделать. Подскажите как это реализовать!
Вот мой пример.
PHP код:

$cOldEmail Get-Content New.csv ConvertFrom-Csv -Delimiter ","
$cNewEmail Get-Content old.csv ConvertFrom-Csv -Delimiter ","
Compare-Object -ReferenceObject $cNewEmail -DifferenceObject $cOldEmail -sync 0 

:teeth:

Kazun 19-01-2012 14:53 1839598

Код:

$cOldEmail = Get-Content New.csv | ConvertFrom-Csv -Delimiter ","
$cNewEmail = Get-Content old.csv | ConvertFrom-Csv -Delimiter ","
$new = @()
$del = @()

$names = Compare-Object -ReferenceObject $cNewEmail -DifferenceObject $cOldEmail `
        -Property Name,Mail

foreach($name in $names)
{
        switch($name.SideIndicator)
        {
                "=>" {$new += $name;break}
                "<=" {$del += $name;break}
        }
}


dosperados 23-01-2012 13:22 1842599

Немогу понять в чем проблема, иногда он правильно все обрабатывает, а иногда при выполнении этого кода выдает ошибку.

Код:
PHP код:

$cOldEmail Get-Content $OutlookPath"\OldEmail.csv" ConvertFrom-Csv -Delimiter "," 
        
$cNewEmail Get-Content $OutlookPath"\NewEmail.csv" ConvertFrom-Csv -Delimiter "," 
        
$new = @();$del = @()
            
$names Compare-Object -ReferenceObject $cNewEmail -DifferenceObject $cOldEmail -Property "Name","Mail" # помещаем результат сравнения в переменную
                
foreach($name in $names)
                {
                    switch(
$name.SideIndicator# И для SideIndicator => помещяем в переменную $Del, для <= в $New
                    
{"=>" {$Old += $name;break}
                     
"<=" {$New += $name;break}
                    }
                } 

Ошибка:
Цитата:

Произошла ошибка при вызове метода, так как [System.Management.Automation.PSObject] не содержит метод с
именем "op_Addition".
C:\Users\profile\AppData\Local\Temp\0ac1bf35-a743-4f80-acdb-2d09f32.ps1:17 знак:20
+ {"=>" {$Old += <<<< $name;break}
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Kazun 23-01-2012 13:25 1842601

$new = @();$del = @() - $Old,$New - поменяйте OLD на DEL

dosperados 23-01-2012 13:45 1842622

Извините) опечатался и не заметил...

dosperados 30-01-2012 07:45 1847363

Есть ещё вопрос, как с помощью Compare-Object сравнить два массива с разными именами свойств объектов
из файла:

OldADEmail.csv
подгружается массив имеющий вот такие имена свойств
"Department","Name","Company","Mail","Title"

а из файла
Email.csv
"Department","LastName","CompanyName","Email1Address","JobTitle"

т.е. содержимое файлов одинаковое, только Compare-Object не понимает на автомате это.
Если указываешь параметр -Property можно указать только один раз. (невозможно поставить соответсвия)

dosperados 30-01-2012 09:23 1847402

Вот что смог сделать сам, насколько это правильно?
Код:

                $cNewEmail = @()
                $Email | Foreach {
                $user = $_
                New-Object PsObject -Property @{
                Department = [string]$user.department
                Name = [string]$user.LastName
                Company = [string]$user.CompanyName
                Mail = [string]$user.Email1Address
                Title = [string]$user.JobTitle
                }
                $cNewEmail += $user
                }

или как сделать проще.

Kazun 31-01-2012 10:47 1848178

Код:

$cNewEmail = Get-Content NewEmail.csv | Select -Skip 1 | ConvertFrom-Csv -Header "Department","Name","Company","Mail","Title" -Delimiter ","


Время: 17:57.

Время: 17:57.
© OSzone.net 2001-