Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122

Group-object и пустые значения

29.02.2024, 06:23. Показов 3205. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобраться. Собирается некий
Code
1
2
3
4
5
6
7
8
foreach ($val in $vals)
 $arr += [pscustomobject]@{
a = $val1
b = $val2
c = $val3
d = $val4
}
$arr | ft
. Собирается все это в некую табличку.
Мне нужно сгруппировать строки по нескольким свойствам.
Code
1
$doubl = ($arr | Group-Object  a, b,  c | Where{$_.count -ne 1}).Group
Все прекрасно до тех пор пока в значениях перечисленных свойств не начинаю попадать пустые значения. Просто уходит в ошибку шел, ругается на позиционирование.
я конечно воткнул костыль:
Code
1
$arr | ? {$_.a -eq $null} | % {$_.a = 'Null'}
Но свойств много, не буду же я писать этот кастыль для каждого, форичем пробежатся по всем свойствам и заменить значения на нулл тоже так себе, но уже лучше. Почитал справку, не че не нашел. Неужели нельзя включить в Group-object $NULL?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.02.2024, 06:23
Ответы с готовыми решениями:

Изменение существующей группы object-group
Существует группа на CISCO object-group service Ports tcp eq 2555 tcp eq 3444 и т.д. какими командами можно добавить в...

Внесение изменений в Group Policy Object
Привет всем! Может кто-нибудь подсказать, как внутри Group Policy Object делать изменения с помощью Powershell? Например создать...

Cisco ASA, object group - remark?
День добрый, я тут пытаюсь нагуглить можно ли оставить комментарий к добавленному хосту в object-group? Делаю network-object host 1.2.3.4...

78
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
29.02.2024, 15:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sergey020487 Посмотреть сообщение
А у меня еще вопрос, А если нужно сгруппировать все свойства, но в тоже время проссумировать определенные. на примере sql select sum(ПродажаРуб ) group by НомерТоварнойНакладной, НомерЗаказа...
В рамках идеалогии 'обьект' самое удобное - подключить C# + LINQ.
( и я же говорил, утонешь )

Лучше вообще отойти ото всех этих custom object и group by и просто пользоваться возможностями хэш-таблиц, как было уже показано.

Добавлено через 7 минут
PS: для справки
как выглядит работа с об'ектами и технологией LINQ на C#:

C#
1
2
3
4
var query = (from t1 in _db.Table1 join t2 in _db.Table2 on t1.CId equals
             t2.ID where t1.DateAdded >= fromDate && t1.DateAdded <= toDate select t2)
            .GroupBy(c => c.Brand)
            .ToDictionary(t => t.Key, t => t.Sum(x => x.Qty));
1
5997 / 4572 / 1096
Регистрация: 29.08.2013
Сообщений: 28,244
Записей в блоге: 3
29.02.2024, 15:53
много какой sql сейчас сам умеет xml разбирать и не нужно построчно мучаться
загрузил во временную таблицу и обрабатывай его
1
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
29.02.2024, 17:52
Цитата Сообщение от volodin661 Посмотреть сообщение
В рамках идеалогии 'обьект' самое удобное - подключить C# + LINQ.
так ведь и powershell + LINQ, тоже не халам балам...
если уж дело дошло до:
Цитата Сообщение от sergey020487 Посмотреть сообщение
К сожалению не могу, у меня четкое указание, в скуле только инсерт. Типо начал делать в шеле, делай до конца.
Добавлено через 1 минуту
вот, кстати, про это
1
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
29.02.2024, 18:08
Цитата Сообщение от YuS_2 Посмотреть сообщение
powershell + LINQ, тоже не халам балам...

а как там воспроизвести все эти красоты SQL-подобного синтаксиса LINQ ?

C#
1
2
3
4
5
IEnumerable<int> numQuery1 =
    from num in numbers
    where num % 2 == 0
    orderby num
    select num;
1
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
29.02.2024, 18:28
Цитата Сообщение от volodin661 Посмотреть сообщение
как там воспроизвести все эти красоты SQL-подобного синтаксиса LINQ ?
ну, вот ссылка выше была, там разве не то?
1
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
29.02.2024, 18:34
Цитата Сообщение от qwertehok Посмотреть сообщение
много какой sql сейчас сам умеет xml разбирать и не нужно построчно мучаться
загрузил во временную таблицу и обрабатывай его
на все технологически-стратегические советы у ТС ответ, что он де человек маленький,
практическая цель его мало интересует, а больше интересует желание понравиться кому-то 'сверху'.
1
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122
01.03.2024, 05:46  [ТС]
YuS_2, Спасибо за ссылку. Возможности linq впечатляют, я правда разбираться буду неделю как сгруппировать-просуммировать массив
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
01.03.2024, 10:37
Цитата Сообщение от sergey020487 Посмотреть сообщение
Возможности linq впечатляют
Это, конечно, да... но, увы, в каждую бочку меда можно закинуть ложку дегтя...
PowerShell
1
2
$arr = [int[]]@(0..100000)
[Linq.Enumerable]::Sum($arr)
- выдаст переполнение...
при этом:
PowerShell
1
$arr|measure -sum
- справится с суммированием и даже с большими числами...
1
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
01.03.2024, 10:51
Цитата Сообщение от YuS_2 Посмотреть сообщение
Это, конечно, да... но, увы, в каждую бочку меда можно закинуть ложку дегтя...
Тут видимо разработчик должен предусмотреть соответствующий тип данных
PowerShell
1
2
$arr = [int64[]]@(0..100000)
[Linq.Enumerable]::Sum($arr)
1
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
01.03.2024, 12:08
Цитата Сообщение от Karen87 Посмотреть сообщение
Тут видимо разработчик должен предусмотреть соответствующий тип данных
Верно! О том и речь, что powershell - это об автоматической типизации, а LINQ потребует внимательного отношения к типам данных и естественно, строгой типизации.
1
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122
01.03.2024, 12:21  [ТС]
В общем лучше чем это я не смог написать
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$rr = $arr | group factory_id, db_id, Дистрибьютор, НомерЗаказа, ДатаЗаказа, НомерТоварнойНакладной, ДатаТоварнойНакладной, ИНН , Супервайзер, Мерчендайзер,ТорговыйАгент,ДолжностьТорговогоАгента,СубъектФедерации,Адрес,Контрагент, КаналСбыта | foreach {
    [pscustomobject] @{
        factory_id = $_.group | select -unique -expand factory_id
        db_id = $_.group | select -unique -expand db_id
        Дистрибьютор = $_.group | select -unique -expand Дистрибьютор
        НомерЗаказа = $_.group | select -unique -expand НомерЗаказа
        ДатаЗаказа = $_.group | select -unique -expand ДатаЗаказа
        НомерТоварнойНакладной = $_.group | select -unique -expand НомерТоварнойНакладной
        ДатаТоварнойНакладной  = $_.group | select -unique -expand ДатаТоварнойНакладной
        ИНН = $_.group | select -unique -expand ИНН
        Супервайзер = $_.group | select -unique -expand Супервайзер
        Мерчендайзер = $_.group | select -unique -expand Мерчендайзер
        ТорговыйАгент = $_.group | select -unique -expand ТорговыйАгент
        ДолжностьТорговогоАгента = $_.group | select -unique -expand ДолжностьТорговогоАгента
        СубъектФедерации = $_.group | select -unique -expand СубъектФедерации
        Адрес = $_.group | select -unique -expand Адрес
        Контрагент = $_.group | select -unique -expand Контрагент
        КаналСбыта = $_.group | select -unique -expand КаналСбыта
        ЗаказКг = ($_.group | measure ЗаказКг -sum).sum
        ЗаказРуб = ($_.group | measure ЗаказРуб -sum).sum
        ОтгрузкаКг = ($_.group | measure ОтгрузкаКг -sum).sum
        ОтгрузкаРуб = ($_.group | measure ОтгрузкаРуб -sum).sum
        ПродажаКг = ($_.group | measure ПродажаКг -sum).sum
        ПродажаРуб = ($_.group | measure ПродажаРуб -sum).sum
        СредняяЦенаРуб = ($_.group | measure СредняяЦенаРуб -sum).sum
        ID_номенклатура = $_.group | select -unique -expand ID_номенклатура
        КодНоменклатуры = $_.group | select -unique -expand КодНоменклатуры
        Номенклатура = $_.group | select -unique -expand Номенклатура
        Бонус = $_.group | select -unique -expand Бонус
    }
    }
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
01.03.2024, 12:25
Цитата Сообщение от volodin661 Посмотреть сообщение
а как там воспроизвести все эти красоты SQL-подобного синтаксиса LINQ ?
Вообще, тут надо копать документацию... пара попыток привели к этому, но конкретных рекомендаций не попалось, да и в литературе сведений маловато... powershell как-то стороной обходят или у разработчиков нет цели для его продвижения. С этим у питона, например, всё гораздо лучше... если сравнить

Добавлено через 2 минуты
Цитата Сообщение от sergey020487 Посмотреть сообщение
В общем лучше чем это я не смог написать
Вы что-то там говорили о примере больших данных... не видно его
1
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122
01.03.2024, 17:04  [ТС]
YuS_2, Сейчас приготовлю

Добавлено через 4 часа 27 минут
YuS_2, чтоб не публиковать перс. данные, решил заменить значения на заранее подготовленные
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$csv = Get-Content -Path '\2.csv'
$csv2 = $csv| ConvertFrom-Csv -Delimiter ';'
 
 
$pap = 'C:\\1.xml'
 [xml]$xml = gc $pap -enc utf8   
    foreach ($Orders in $xml.selectnodes("//Заказ")){
        
            foreach ($j in $csv2){
            if ($Orders.ТорговаяТочка.Супервайзер = $j.Супервайзер){
                $Orders.ТорговаяТочка.Супервайзер = $j.СупервайзерЗнач}
            if ($Orders.ТорговаяТочка.ТорговыйАгент = $j.ТорговыйАгент){
                $Orders.ТорговаяТочка.ТорговыйАгент = $j.ТорговыйАгентЗнач}
            if ($Orders.ТорговаяТочка.ДолжностьТорговогоАгента = $j.ДолжностьТорговогоАгента){
                $Orders.ТорговаяТочка.ДолжностьТорговогоАгента = $j.ДолжностьТорговогоАгентаЗнач}
            if ($Orders.ТорговаяТочка.СубъектФедерации = $j.СубъектФедерации){
                $Orders.ТорговаяТочка.СубъектФедерации = $j.СубъектФедерацииЗнач}
            if ($Orders.ТорговаяТочка.Адрес = $j.Адрес){
                $Orders.ТорговаяТочка.Адрес = $j.АдресЗнач}
            if ($Orders.ТорговаяТочка.Контрагент = $j.Контрагент){
                $Orders.ТорговаяТочка.Контрагент = $j.КонтрагентЗнач}
               
       }
       }
            
       $xml.Save("C:\Temp\ГБ\New folder\готово.xml")
xml 52мб, крутится до сих пор. (
0
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122
02.03.2024, 09:13  [ТС]
YuS_2, volodin661, iNNOKENTIY21, вот файл.
вышеуказанный скрипт обрабатывал его часа 3.5. А мой парсер который я делаю, еще дольше
0
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
02.03.2024, 11:12
Цитата Сообщение от sergey020487 Посмотреть сообщение
xml 52мб, крутится до сих пор. (
привинтить к нему пропеллер и в путь. ( сын Карла )


( на perl разбор занял 0.9 сек )
2
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
02.03.2024, 11:51
Цитата Сообщение от sergey020487 Посмотреть сообщение
вот файл.
ещё нужен пример того, что необходимо получать из него в итоге (достаточно будет несколько строк)
1
0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122
02.03.2024, 14:28  [ТС]
YuS_2, Абсолютно всё что содержит xml. Вот как сейчас, благодаря вам я его распарсиваю:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[xml]$xml = gc $file_ready.FullName -enc utf8
    $arr = foreach ($Orders in $xml.selectnodes("//Заказ")){
        foreach ($i in $Orders.товары.товар){
        $j = $Orders.ТоварнаяНакладная
        $Key = $i.КодНоменклатуры
           [pscustomobject]@{
                factory_id = $ID_Distrib
                db_id = $ID_Distrib
                Дистрибьютор = $Name_Distrib
                НомерЗаказа = $Orders.НомерЗаказа
                ДатаЗаказа = $Orders.Датазаказа
                НомерТоварнойНакладной = if ($j.номер -is [array]){
                                            $j.номер + $j.дата -join ','
                                         } Else {
                                            $j.номер
                                         }
                ДатаТоварнойНакладной = if ($j.дата -is [array]){
                                            $j.дата = $NULL
                                         } Else {
                                            $j.дата
                                         }
                ИНН = $Orders.ТорговаяТочка.ИНН
                Супервайзер = $Orders.ТорговаяТочка.Супервайзер
                Мерчендайзер = $Orders.ТорговаяТочка.Мерчендайзер
                ТорговыйАгент = $Orders.ТорговаяТочка.ТорговыйАгент
                ДолжностьТорговогоАгента = $Orders.ТорговаяТочка.ДолжностьТорговогоАгента
                СубъектФедерации = $Orders.ТорговаяТочка.СубъектФедерации
                Адрес = $Orders.ТорговаяТочка.Адрес
                Контрагент = $Orders.ТорговаяТочка.Контрагент
                КаналСбыта = $Orders.ТорговаяТочка.КаналСбыта
                ЗаказКг = $i.ЗаказКг
                ЗаказРуб = $i.заказруб
                ОтгрузкаКг = $i.ОтгрузкаКг
                ОтгрузкаРуб = $i.ОтгрузкаРуб
                ПродажаКг = $i.ПродажаКГ
                ПродажаРуб = $i.ПродажаРуб
                СредняяЦенаРуб = $i.СредняяЦенаРуб
                КодНоменклатуры = $Key
                Номенклатура = $i.номенклатура
                Бонус = $i.Бонус
                }
0
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
02.03.2024, 17:15
PowerShell
1
2
3
4
5
6
7
8
9
10
11
[xml]$xml = gc 22.xml
 
    $arr =
    foreach ($orders in $xml.selectnodes("//Заказ")){
        foreach ($items in $orders.товары.товар){
            ++$count
        }      
    }
 
 
$count
шуршал 30 секунд.
товару нащитал аж 73259 штук ( из того файла 50Мб )
2
2806 / 504 / 121
Регистрация: 26.09.2020
Сообщений: 952
Записей в блоге: 5
02.03.2024, 17:37
sergey020487, я таки не понял, чего требуется и что заняло 3,5 часа.
Плоская таблица, экспорт в csv 21 сек.
Миниатюры
Group-object и пустые значения  
2
 Аватар для volodin661
7093 / 2324 / 353
Регистрация: 10.12.2013
Сообщений: 8,012
02.03.2024, 18:19
Тест на Perl, используя не XML::Fast, a перловый модуль, базирующийся на C-библиотеке LibXML,
использующей модель DOM, считающейся самой медленной из всех, вместе с записью в базу всех товаров( sqlite через командный интерфейс ) затратил 18 секунд.

Значит powershell должен затрачивать не более минуты.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2024, 18:19

Распространить один object-group на все cisco
Здравствуйте. Есть несколько железок Cisco ASA, на всех есть object-group network PERMITED_INET_HOST и он везде одинаковый. Если его надо...

Нулевые значения баз данных. Object reference not set to an instance of an object
В базе данных существуют пустые поля. Из базы осуществляется вывод на веб страницу в поля ввода. Поля соответствующие нулевым значениям...

Mixing of GROUP columns (MIN(),MAX(),COUNT(),.) with no GROUP columns is illegal if there is no GROUP BY clause
Такая ошибка: КОД: $result=mysql_query(&quot;SELECT description, min(schedule.date) as date FROM schedule where...

Method union of object global failed при попытке затиреть пустые строки
Добрый день есть скрипт в котором я использую код описанный ниже для того, что бы затирать пустые строки. Данный код я использую на...

Пустые поля приводят к ошибке Microsoft VBScript runtime error '800a01a8' Object required
в таблице часть полей не заполняется, делаю селект *, получаю нужные записи, в цикле прохожу, должен вывести результат запроса: while...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru