0 / 0 / 0
Регистрация: 10.02.2024
Сообщений: 122

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

29.02.2024, 06:23. Показов 3292. Ответов 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
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
6001 / 4576 / 1096
Регистрация: 29.08.2013
Сообщений: 28,261
Записей в блоге: 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
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
2807 / 505 / 121
Регистрация: 26.09.2020
Сообщений: 954
Записей в блоге: 5
02.03.2024, 17:37
sergey020487, я таки не понял, чего требуется и что заняло 3,5 часа.
Плоская таблица, экспорт в csv 21 сек.
Миниатюры
Group-object и пустые значения  
2
Нарушитель
7097 / 2328 / 353
Регистрация: 10.12.2013
Сообщений: 8,047
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru