Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Сравнение содержимого двух CSV файлов

Ответить
Настройки темы
PowerShell - [решено] Сравнение содержимого двух CSV файлов

Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Задача такая - есть два файла:
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 


Отправлено: 14:24, 19-01-2012

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$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}
	}
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:53, 19-01-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Код:
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

Отправлено: 13:22, 23-01-2012 | #3


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


$new = @();$del = @() - $Old,$New - поменяйте OLD на DEL
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:25, 23-01-2012 | #4


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:45, 23-01-2012 | #5


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

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

Отправлено: 07:45, 30-01-2012 | #6


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вот что смог сделать сам, насколько это правильно?
Код: Выделить весь код
		$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
		}
или как сделать проще.

Последний раз редактировалось dosperados, 30-01-2012 в 09:57.


Отправлено: 09:23, 30-01-2012 | #7


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$cNewEmail = Get-Content NewEmail.csv | Select -Skip 1 | ConvertFrom-Csv -Header "Department","Name","Company","Mail","Title" -Delimiter ","
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:47, 31-01-2012 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Сравнение содержимого двух CSV файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Побайтовое сравнение двух файлов korenza Скриптовые языки администрирования Windows 14 15-07-2018 17:18
CMD/BAT - [решено] Сравнение двух файлов>ветвление "fc" или "diff" dARKest Скриптовые языки администрирования Windows 4 06-07-2009 23:02
Сравнение производительности двух ОС Dabaduch Хочу все знать 3 13-06-2009 19:27
Сравнение двух процов Rozmen Хочу все знать 4 03-08-2008 12:35
Разное - [решено] Не изменить ассоциацию файлов CSV с Excel на TablePro truvo Microsoft Windows 2000/XP 3 26-07-2008 08:44




 
Переход