PowerShell - [решено] Поиск в csv файле
-
DJ Mogarych
Re: PowerShell - [решено] Поиск в csv файле
Код:
Код: Выделить всё
$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-
ejik_off
-
ejik_off
Re: PowerShell - [решено] Поиск в csv файле
ejik_off, это потому, что у Вас в примере в csv-файле одна строка. Я всё время забываю, что нужно постоянно отслеживать эти долбаные просчёты в архитектуре милые шалости PowerShell'a.
Замените в том коде эту строку:
Код:
на эту:
Код:
Замените в том коде эту строку:
Код:
Код: Выделить всё
$sCSVContent = Import-Csv -Path $sCSVFileна эту:
Код:
Код: Выделить всё
$sCSVContent = , (Import-Csv -Path $sCSVFile)-
DJ Mogarych
Re: PowerShell - [решено] Поиск в csv файле
А, так вот в чём дело - а я и думаю, почему в csv просто так нельзя было добавить строку, и надо было принудительно указывать, что это массив, а не кастом-объект. В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?
-
greg zakharov
Re: PowerShell - [решено] Поиск в csv файле
Цитата DJ Mogarych:
В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
Ладно, я понимаю, когда совсем нет элементов — тут деваться некуда. Это надо проверять. Так было с незапамятных времён, так и осталось. Но PowerShell теперь к этим двум вариантам добавляет ещё и третий вариант, абсолютно бессмысленный с точки зрения программирования, но который тоже приходится учитывать.
Может быть, в шестой версии, которая у коллеги greg zakharov, это уже не так, и для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях. Дай-то бог. Но у меня, в 5.1, пока что так:
Скрытый текст
[spoiler]
[/spoiler]
В принципе, логично - PS что видит, так и интерпретирует, объект один, так почему это должно быть массивом?
PowerShell - [решено] Поиск в csv файле
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
Ладно, я понимаю, когда совсем нет элементов — тут деваться некуда. Это надо проверять. Так было с незапамятных времён, так и осталось. Но PowerShell теперь к этим двум вариантам добавляет ещё и третий вариант, абсолютно бессмысленный с точки зрения программирования, но который тоже приходится учитывать.
Может быть, в шестой версии, которая у коллеги greg zakharov, это уже не так, и для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях. Дай-то бог. Но у меня, в 5.1, пока что так:
Скрытый текст
[spoiler]
[/spoiler]-
greg zakharov
Re: PowerShell - [решено] Поиск в csv файле
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Тот же результат будет и в шестерке и в семерке.
-
greg zakharov
Re: PowerShell - [решено] Поиск в csv файле
Цитата greg zakharov:
И да, вы непременно удалите это сообщение, сославшись на якобы нарушение форумных правил.
Я удалю ваши сообщения, поскольку они явным образом нарушают пункты 3.1 и 3.7
И да, вы непременно удалите это сообщение, сославшись на якобы нарушение форумных правил.
Я удалю ваши сообщения, поскольку они явным образом нарушают пункты 3.1 и 3.7
общих правил
форума.-
Petya V4sechkin
Re: PowerShell - [решено] Поиск в csv файле
Цитата Iska:
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично.
А если потребуется не массив, а единственный элемент, сохраняемый с определенным типом? Ситуации бывают разные, иногда, как раз, требуется ограничить данные, чтобы получался на выходе не массив.
Цитата Iska:
А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично.
При наличии функциональности автоматического приведения типов, это, скорее, логично. И не в командлете загвоздка, кстати...
Цитата Iska:
И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
Всё гораздо проще:
Если требуется таки массив, при любом количестве данных, то необходимо указать тип переменной, либо:
Цитата Iska:
для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях.
Командлет, в данном случае, не при чем, так работало:
и продолжает работать автоматическое приведение типов:
И кроме того, есть ведь специальный оператор массива:
Код:
Так что логика, определенно, присутствует... к ней просто надо привыкнуть.
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично.
PowerShell - [решено] Поиск в csv файле
А если потребуется не массив, а единственный элемент, сохраняемый с определенным типом? Ситуации бывают разные, иногда, как раз, требуется ограничить данные, чтобы получался на выходе не массив.
Цитата Iska:
А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично.
PowerShell - [решено] Поиск в csv файле
При наличии функциональности автоматического приведения типов, это, скорее, логично. И не в командлете загвоздка, кстати...
Цитата Iska:
И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
PowerShell - [решено] Поиск в csv файле
Всё гораздо проще:
Если требуется таки массив, при любом количестве данных, то необходимо указать тип переменной, либо:
Цитата Iska:
для одной строки командлет Import-Csv возвращает именно массив из одного элемента. Как и прочие командлеты в аналогичных случаях.
PowerShell - [решено] Поиск в 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)Так что логика, определенно, присутствует... к ней просто надо привыкнуть.
-
YuS_2
Re: PowerShell - [решено] Поиск в csv файле
Цитата Iska:
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
Тип не зависит от количества. Практически все командлеты написаны под функциональный стиль использования - они не "возвращают", они выдают результат в первый поток. Это вы своим любимым императивным подходом обращаетесь к неявным преобразованиям типов.
Я бы предпочёл, чтобы это был массив из одного элемента — вот это было бы вполне логично. А когда тип возвращаемого командлетом значения зависит от количества данных — это, простите, совсем нелогично. И по факту на каждый такой случай всё равно приходится при кодировании либо «лепить» подобную конструкцию, либо отдельно учитывать случай с возвращаемым базовым типом вместо массива.
PowerShell - [решено] Поиск в csv файле
Тип не зависит от количества. Практически все командлеты написаны под функциональный стиль использования - они не "возвращают", они выдают результат в первый поток. Это вы своим любимым императивным подходом обращаетесь к неявным преобразованиям типов.