Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

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

Старожил


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

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


Всем привет!

Стоит задача: сравнивать результаты обучающихся (БД MySQL) с пользователями в Active Directory и считать процент (количество) не обученных.

Для этого начал писать скрипт на Powershell, в котором есть такое:
1. Выгрузить данные из MySQL (mysql.csv)
Export form MySQL
#Connection options
$constring="server=10.7.7.7;uid=myuser;pwd=mypassword;database=mydb;Pooling=False"

$mysql = New-Object MySql.Data.MySqlClient.MySqlConnection($constring)
$mysql.Open()

#Collect data from table
$sqlquery1 = "select * from mytable"
$req = New-Object Mysql.Data.MysqlClient.MySqlCommand($sqlquery1,$mysql)
$dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($req)
$dataSet = New-Object System.Data.DataSet
$dataAdapter.Fill($dataSet, "Query1") | Out-Null

#Export data to CSV
$dataSet.Tables["Query1"] | Export-Csv -path "C:\Users\dahiko\Desktop\mysql.csv" -Encoding UTF8 -NoTypeInformation


2. Выгрузить пользователей из определенной OU Active Directory (ad.csv)
Export form AD
$OUUsers=@(
'OU=AllUsers,OU=filial1,DC=my,DC=domain,DC=ru',
'OU=AllUserss,OU=filial2,DC=my,DC=domain,DC=ru')

$OUUsers | foreach { Get-ADUser -Filter {(Enabled -eq "True")} -SearchBase $_ -Properties *} | Select mail,Name, samaccountname, distinguishedName, whenCreated, department, title, city,description,Company,telephoneNumber,mobile | ConvertTo-CSV | Out-File "C:\Users\dahiko\Desktop\ad.csv"


Вот как теперь в файле mysql.csv найти всех, кто есть в файле ad.csv и высчитать процент необученных? Может у кого-то есть примеры чего-то похожего по сравнению двух файлов? В обоих файлах есть одинаковое поле "mail"

Заранее благодарен.

Отправлено: 12:56, 11-01-2022

 

Аватара для YuS_2

Crazy


Contributor


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

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


dahiko,
Прикрепите примеры обоих файлов (конфиденциальные данные можете изменить), тогда можно будет предложить алгоритм.
На вскидку:
Выделить сравниваемые поля из обоих файлов и сравнить оба набора данных через compare-object

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:45, 11-01-2022 | #2



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

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


Старожил


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

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


Вложения
Тип файла: txt mysql.txt
(227 байт, 2 просмотров)
Тип файла: txt ad.txt
(718 байт, 2 просмотров)

Цитата YuS_2:
Прикрепите примеры обоих файлов »
Файлы прикрепил. Создал вручную, потому что пока нет доступа к БД и AD.

Отправлено: 12:18, 12-01-2022 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


dahiko, пример хороший, только одинакового поля mail нет, в одном файле это mail, в другом - email.
И в AD меньше пользователей, чем в Mysql, т. е., обучившихся больше, чем людей в наличии.

Если поправить это, то получится так, как и предположил YuS_2:

Код: Выделить весь код
$notTrained = compare ($csvAD = import-csv "D:\temp\compare\ad.txt") ($csvMysql = import-csv "D:\temp\compare\mysql.txt") -Property mail |? SideIndicator -eq '<='

# процент
(($notTrained |measure).count / ($csvad |measure).count).ToString("P")

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:11, 12-01-2022 | #4


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата dahiko:
Создал вручную, потому что пока нет доступа к БД и AD. »
Код: Выделить весь код
$a = gc ad.txt -enc utf8|convertfrom-csv
$b = gc mysql.txt -enc utf8|convertfrom-csv
diff $a.mail $b.email

-------
scio me nihil scire. Ѫ


Отправлено: 14:45, 12-01-2022 | #5


Старожил


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

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


Цитата DJ Mogarych:
только одинакового поля mail нет, в одном файле это mail, в другом - email. »
Это исправил. Теперь в обоих файлах "mail".

Цитата DJ Mogarych:
И в AD меньше пользователей, чем в Mysql »
Тут все верно. Обучившихся может быть больше, чем пользователей в файле ad.csv. Потому что в ad.csv пользователи только из определенных OU (Только те предприятия, которые проверяем в данный момент).


Не понял, но почему-то скрипт считает процент не верно. Скрипт возвращает 50,00%. Хотя в файле mysql.csv есть все люди из файла ad.csv. Значит результат должен быть 100%

Отправлено: 15:00, 12-01-2022 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Это процент тех, кто не обучился, т. е., есть в AD, но нет в Mysql.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 15:10, 12-01-2022 | #7


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата dahiko:
Не понял, но почему-то скрипт считает процент не верно. Скрипт возвращает 50,00%. Хотя в файле mysql.csv есть все люди из файла ad.csv. Значит результат должен быть 100% »
Вы уточните задачу, в привязке к файлам, кто из них кто, где список тех кого необходимо учитывать в обоих файлах, кто именно из них обученные, и процент кого именно необходимо вычислять?

-------
scio me nihil scire. Ѫ


Отправлено: 15:17, 12-01-2022 | #8


Старожил


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

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


Прошу прощения. Скрипт правильно посчитал. Он вернул 50%, поточу что у одного пользователя в ad.csv не было кавычки. Поэтому одного пользователя скрипт не смог найти с файле mysql.csv.

Подскажите, как добавить в вывод скрипта еще две цифры?
1. Количество уникальных пользователей из файла ad.csv
2. Количество обученных уникальных пользователей из файла mysql.csv, которые есть в файле ad.csv. В файле mysql.csv один человек может быть указан несколько раз, т.к. есть несколько курсов, которым обучаются пользователи)

Отправлено: 17:38, 12-01-2022 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Код: Выделить весь код
$csvAD |sort mail -Unique
$notTrained |sort -Unique
https://docs.microsoft.com/en-us/pow...powershell-7.2

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 17:53, 12-01-2022 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Замена текста из одного файла в другом blackeangel Скриптовые языки администрирования Windows 6 20-11-2015 11:07
CMD/BAT - [решено] Замена строки из одного файла в другом по маске blackeangel Скриптовые языки администрирования Windows 2 10-11-2015 16:05
CMD/BAT - [решено] поиск и замена из одного файла в другом alexmoreman Скриптовые языки администрирования Windows 6 27-05-2013 09:33
VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой TRaMeLL Скриптовые языки администрирования Windows 31 17-10-2012 11:33
PowerShell - [решено] Поиск и вставка информации из одного csv-файла в другой IvanXXL Скриптовые языки администрирования Windows 1 20-07-2011 12:48




 
Переход