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

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

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

Аватара для ejik_off

Старожил


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

Профиль | Отправить 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

 

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

fascinating rhythm


Moderator


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

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


Код: Выделить весь код
$txt = gc D:\temp\test\Users.txt
[array]$csv = import-csv D:\temp\test\user_list.csv

foreach ($login in $txt) {
    if ($login -notin $csv.samaccountname) {
    $csv += [pscustomobject]@{samaccountname="$login";count="1"}
    }
    else {([double]($csv |? samaccountname -eq "$login").count)++}
}

$csv |export-csv D:\temp\test\user_list.csv -NoTypeInformation

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

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

Отправлено: 11:15, 24-12-2019 | #11



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

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


Аватара для ejik_off

Старожил


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

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


DJ Mogarych, спасибо, работает!

Отправлено: 12:21, 24-12-2019 | #12


Ветеран


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

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


ejik_off, это потому, что у Вас в примере в csv-файле одна строка. Я всё время забываю, что нужно постоянно отслеживать эти долбаные просчёты в архитектуре милые шалости PowerShell'a.

Замените в том коде эту строку:
Код: Выделить весь код
$sCSVContent = Import-Csv  -Path $sCSVFile
на эту:
Код: Выделить весь код
$sCSVContent = , (Import-Csv  -Path $sCSVFile)
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:22, 24-12-2019 | #13


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

fascinating rhythm


Moderator


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

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


А, так вот в чём дело - а я и думаю, почему в csv просто так нельзя было добавить строку, и надо было принудительно указывать, что это массив, а не кастом-объект. В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?

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


Отправлено: 08:48, 25-12-2019 | #14


Забанен


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

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


Какие все однако переутомившиеся: сперва венгерская нотация, потом бредни про массив...
Код: Выделить весь код
$c = Import-Csv .\input.csv
$c.GetType() # возвращает Object[]

Отправлено: 10:38, 25-12-2019 | #15


Ветеран


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

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


Цитата DJ Mogarych:
В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом? »
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.

Ладно, я понимаю, когда совсем нет элементов — тут деваться некуда. Это надо проверять. Так было с незапамятных времён, так и осталось. Но PowerShell теперь к этим двум вариантам добавляет ещё и третий вариант, абсолютно бессмысленный с точки зрения программирования, но который тоже приходится учитывать.

Может быть, в шестой версии, которая у коллеги greg zakharov, это уже не так, и для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях. Дай-то бог. Но у меня, в 5.1, пока что так:
Скрытый текст

Отправлено: 20:22, 25-12-2019 | #16


Забанен


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

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


Iska, специально для вас:
Код: Выделить весь код
E:\sandbox
λ $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  145


E:\sandbox
λ $c = Import-Csv .\input.txt

E:\sandbox
λ $c.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array



E:\sandbox
λ $c[0]

samaccountname count
-------------- -----
ppetrov        1

E:\sandbox
λ $c[0].samaccountname
ppetrov
Тот же результат будет и в шестерке и в семерке.

Отправлено: 20:46, 25-12-2019 | #17



Moderator


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

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


Цитата greg zakharov:
И да, вы непременно удалите это сообщение, сославшись на якобы нарушение форумных правил.
Я удалю ваши сообщения, поскольку они явным образом нарушают пункты 3.1 и 3.7 общих правил форума.

Отправлено: 21:58, 25-12-2019 | #18


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. »
А если потребуется не массив, а единственный элемент, сохраняемый с определенным типом? Ситуации бывают разные, иногда, как раз, требуется ограничить данные, чтобы получался на выходе не массив.

Цитата Iska:
А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. »
При наличии функциональности автоматического приведения типов, это, скорее, логично. И не в командлете загвоздка, кстати...

Цитата Iska:
И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива. »
Всё гораздо проще:
Если требуется таки массив, при любом количестве данных, то необходимо указать тип переменной, либо:


Цитата Iska:
для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях. »
Командлет, в данном случае, не при чем, так работало:


и продолжает работать автоматическое приведение типов:


И кроме того, есть ведь специальный оператор массива:
The array operator is useful in scripts when you are getting objects, but do not know how many objects you get.
Код: Выделить весь код
$p = @(Get-Process Notepad)
Так что логика, определенно, присутствует... к ней просто надо привыкнуть.

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


Последний раз редактировалось YuS_2, 26-12-2019 в 07:46.

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

Отправлено: 07:34, 26-12-2019 | #19


Ветеран


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

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


Цитата Iska:
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива. »
Тип не зависит от количества. Практически все командлеты написаны под функциональный стиль использования - они не "возвращают", они выдают результат в первый поток. Это вы своим любимым императивным подходом обращаетесь к неявным преобразованиям типов.

Последний раз редактировалось Busla, 26-12-2019 в 12:59.


Отправлено: 10:53, 26-12-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход