|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск в csv файле |
|
|
PowerShell - [решено] Поиск в csv файле
|
Старожил Сообщения: 473 |
Профиль | Отправить PM | Цитировать Здравствуйте, гуру PS!!!
Есть файл тхт в нем содержатся логины: ppetrov iivanov ssidorov ... и есть csv файл в формате samaccountname,count samaccountname,count ppetrov,1 iivanov,1 ssidorov,2 нужно сделать поиск, т.е логины из тхт файла сравнить с логинами из csv-файла если логин найден, то поле count увеличить на 1, если не найдено то добавить в конец файла в поле samaccountname: логин и в count: 1 $txt = get-content c:\tmp\usr.txt $csv = import-csv c:\tmp\usr_list.csv -Delimiter "," foreach($user_txt in $txt) { foreach($user_csv in $csv){ if($user_txt -eq $user_csv.samaccountname) { как изменить колонку count? } else {$user_txt,1 | out-file c:\tmp\usr_list.csv -Append - тоже не знаю как правильно вставить} } } |
|
Отправлено: 17:12, 23-12-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать ejik_off, вот взяли бы, да приложили в архиве и тот, и другой файл для облегчения работы отвечающим.
Попробуйте так: Скрытый текст
$sTxtFile = 'C:\Мои проекты\0289\0001.txt' $sCSVFile = 'C:\Мои проекты\0289\0002.csv' $sTxtContent = Get-Content -Path $sTxtFile $sCSVContent = Import-Csv -Path $sCSVFile $sTxtContent | ForEach-Object -Process { $oCSVObject = $sCSVContent | Where-Object -Property 'samaccountname' -eq -Value $_ if($oCSVObject) { $oCSVObject.count = [System.String]([System.Int32]($oCSVObject.count) + 1) } else { $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = '1'} } } $sCSVContent | ConvertTo-Csv -NoTypeInformation | ForEach-Object -Process { $_.Replace('"','') } | Set-Content -Path $sCSVFile -Force |
Отправлено: 19:01, 23-12-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 473
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Огромное спасибо за скрипт, работает!!!! |
|
Отправлено: 20:38, 23-12-2019 | #3 |
Забанен Сообщения: 793
|
Iska, венгерская нотация в PowerShell? Переутомление? Да и лучше сделать так (PowerShell v6):
$csv, $txt = (Import-Csv .\input.csv -Delimiter ','), (Get-Content .\input.txt) $txt.ForEach{ .({ $csv += [PSCustomObject]@{samaccountname = $_; count = 1} },{ ++[Int32]$csv[$csv.samaccountname.IndexOf($_)].count })[[Byte]($_ -in $csv.samaccountname)] } ($csv | ConvertTo-Csv) -replace '"' | Out-File .\input.csv time { $csv, $txt = (Import-Csv .\input.csv -Delimiter ','), (Get-Content .\input.txt) $txt.ForEach{ .({ $csv += [PSCustomObject]@{samaccountname = $_; count = 1} },{ ++[Int32]$csv[$csv.samaccountname.IndexOf($_)].count })[[Byte]($_ -in $csv.samaccountname)] } ($csv | ConvertTo-Csv) -replace '"' | Out-File .\input.csv }, { $sTxtFile = '.\input1.txt' $sCSVFile = '.\input1.csv' $sTxtContent = Get-Content -Path $sTxtFile $sCSVContent = Import-Csv -Path $sCSVFile $sTxtContent | ForEach-Object -Process { $oCSVObject = $sCSVContent | Where-Object -Property 'samaccountname' -eq -Value $_ if($oCSVObject) { $oCSVObject.count = [System.String]([System.Int32]($oCSVObject.count) + 1) } else { $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = '1'} } } $sCSVContent | ConvertTo-Csv -NoTypeInformation | ForEach-Object -Process { $_.Replace('"','') } | Set-Content -Path $sCSVFile -Force } # итог: Total ms: 37.7992 Total ms: 108.8279 |
Отправлено: 21:27, 23-12-2019 | #4 |
Старожил Сообщения: 473
|
Профиль | Отправить PM | Цитировать greg zakharov, классно, осталось понять как он работает )))
|
|
Отправлено: 05:43, 24-12-2019 | #5 |
Старожил Сообщения: 473
|
Профиль | Отправить PM | Цитировать на рабочем компе скрипт не работает, видно версии PS разные. На раб.станции версия 5.1.17763.771
Скрытый текст
Сбой вызова метода из-за отсутствия в [System.Management.Automation.PSObject] метода с именем "op_Addition". строка:12 знак:8 + $sCSVContent += [PSCustomObject]@{samaccountname = $_; count = ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound как адаптировать скрипт? |
Отправлено: 07:53, 24-12-2019 | #6 |
fascinating rhythm Сообщения: 6616
|
Профиль | Отправить PM | Цитировать ejik_off, используйте первый вариант. Вряд ли в данном случае разница в 70 миллисекунд имеет большое значение.
|
------- Отправлено: 08:55, 24-12-2019 | #7 |
Старожил Сообщения: 473
|
Профиль | Отправить PM | Цитировать оба варианта дают такую ошибку
|
Отправлено: 09:11, 24-12-2019 | #8 |
fascinating rhythm Сообщения: 6616
|
Профиль | Отправить PM | Цитировать ejik_off, дайте примеры файлов, хоть будет на чём протестировать.
|
------- Отправлено: 09:36, 24-12-2019 | #9 |
Старожил Сообщения: 473
|
Профиль | Отправить PM | Цитировать прикрепил архив
|
Последний раз редактировалось ejik_off, 01-05-2020 в 16:09. Отправлено: 10:13, 24-12-2019 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - поиск по части IP адреса в CSV файле | God-of-Chaos | Скриптовые языки администрирования Windows | 3 | 06-11-2017 10:45 | |
PowerShell - [решено] Переименование дублей в csv файле | YURETZS | Скриптовые языки администрирования Windows | 3 | 20-10-2017 11:42 | |
CMD/BAT - Поиск цифр в текстовом файле и последующий их поиск в названии файлов массива (лог.) | antares_80@vk | Скриптовые языки администрирования Windows | 10 | 25-10-2015 11:34 | |
PowerShell - [решено] Поиск и вставка информации из одного csv-файла в другой | IvanXXL | Скриптовые языки администрирования Windows | 1 | 20-07-2011 12:48 | |
PowerShell - [решено] Поиск и удаление дублей в csv-файле | IvanXXL | Скриптовые языки администрирования Windows | 4 | 19-07-2011 13:14 |
|