PDA

Показать полную графическую версию : [решено] Сравнение содержимого двух CSV файлов


dosperados
19-01-2012, 14:24
Задача такая - есть два файла:
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 вообще как то непонятно проводит сравнение, возможно им вообще не получится это сделать. Подскажите как это реализовать!
Вот мой пример.
$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
$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
Немогу понять в чем проблема, иногда он правильно все обрабатывает, а иногда при выполнении этого кода выдает ошибку.

Код:
$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
$new = @();$del = @() - $Old,$New - поменяйте OLD на DEL

dosperados
23-01-2012, 13:45
Извините) опечатался и не заметил...

dosperados
30-01-2012, 07:45
Есть ещё вопрос, как с помощью 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
Вот что смог сделать сам, насколько это правильно?
$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
$cNewEmail = Get-Content NewEmail.csv | Select -Skip 1 | ConvertFrom-Csv -Header "Department","Name","Company","Mail","Title" -Delimiter ","




© OSzone.net 2001-2012