![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Вывод элементов списка в виде массива |
|
|
PowerShell - Вывод элементов списка в виде массива
|
Ветеран Сообщения: 4635 |
Уважаемые, здравствуйте!
Задалcя вопросом обработки *.xml файлов, вроде бы даже добился какого-никакого решения поставленной перед Собою задачи, но вот одного не могу разрешить: вывод элемента списка в виде массива, Powershell его "подрезает" и отображает только несколько первых символов. Список объявляю так: Наполняю так: $aSumItog = @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); foreach ($item in $tmplist2) { $list2.Add([PSCustomObject]@{cFIO = $item; cSum = $aSumItog}) } , а хотелось бы видеть все столбцы массива. Может, кто подскажет как этого добиться? |
|
Отправлено: 19:24, 25-10-2023 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Да, совсем забыл:
код просто подкорректирован для наличия нескольких однотипных элементов в одном файле, но считать может пока неверно... т.е. его ещё надо проверять. |
------- Отправлено: 12:51, 29-10-2023 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Цитата YuS_2:
![]() Скрытый текст
Цитата:
Цитата YuS_2:
Цитата YuS_2:
|
|||||
Последний раз редактировалось NickM, 29-10-2023 в 13:30. Отправлено: 12:55, 29-10-2023 | #22 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата NickM:
Цитата NickM:
Цитата NickM:
Примерно так: # Функция получения кода документа и периода (месяц/квартал) function Get-NodeAttrDoc ($xml,$node,$enc){ process{ $n = $xml.selectnodes("//$node") [pscustomobject]@{'КНД' = $n.кнд;'Период' = $n.период} } } # Функция формирования выходных данных function Get-NodeDataOut ($xml,$node,$pnode,$per,$dat,$fio,$enc,$knd){ process{ $tarr = $xml.selectnodes("//$node") $out = foreach($t in $tarr){ $s,$sv,$tsv = @(@([double]0)*13),@(@([double]0)*3),$null if($pnode){ $f,$inn,$sni = $t.$pnode.$fio,$t.$pnode.иннфл,$t.$pnode.снилс } else { $f,$inn,$sni = $t.$fio,$t.иннфл,$t.снилс } if (($i=[int]$per) -lt 13){$s[$i] = [double]$t.сумвыпл} else { $tsv = $t.getelementsbytagname($dat) if ($tsv){ foreach($it in $tsv){ $sv[([int]$it.месяц-1)] = [double]$it.сумвыпл } } switch ($per){ $kv[0]{$s[1]=$sv[0];$s[2]=$sv[1];$s[3]=$sv[2]} $kv[1]{$s[4]=$sv[0];$s[5]=$sv[1];$s[6]=$sv[2]} $kv[2]{$s[7]=$sv[0];$s[8]=$sv[1];$s[9]=$sv[2]} $kv[3]{$s[10]=$sv[0];$s[11]=$sv[1];$s[12]=$sv[2]} } $s[0] = ($s|measure -sum).sum } [pscustomobject]@{ 'КНД' = $knd 'ФИО' = ($f.фамилия,$f.имя,$f.отчество) -join ' ' 'ИННФЛ' = $inn 'СНИЛС' = $sni 'СумГод' = $s[0] '01' = $s[1] '02' = $s[2] '03' = $s[3] '04' = $s[4] '05' = $s[5] '06' = $s[6] '07' = $s[7] '08' = $s[8] '09' = $s[9] '10' = $s[10] '11' = $s[11] '12' = $s[12] } } } end{return $out} } # Функция суммирования отдельных документов на единое лицо function get-sumdoc1162 ($elem,$i){ $b = $i|%{($elem.$_|measure -sum).sum} [pscustomobject]@{ 'КНД' = $elem[0].кнд 'ФИО' = $elem[0].фио 'ИННФЛ' = $elem[0].иннфл 'СНИЛС' = $elem[0].снилс 'СумГод' = ($b|measure -sum).sum '01' = $b[0] '02' = $b[1] '03' = $b[2] '04' = $b[3] '05' = $b[4] '06' = $b[5] '07' = $b[6] '08' = $b[7] '09' = $b[8] '10' = $b[9] '11' = $b[10] '12' = $b[11] } } # Инициализация переменных и сплаттинг $path = "$psscriptroot\xml" if ($host.version.major -gt 5) { $enc = 'windows-1251' $csv = @{ Encoding = 'utf8' NoTypeInformation = $true UseQuotes = 'AsNeed' } } else { $enc = 'default' $csv = @{ Encoding = 'utf8' NoTypeInformation = $true } } $flt = 'NO_*.xml' $nd = 'Документ' $nd_pssl = 'ПерсСвСтрахЛиц' $nd_dfl = 'ДанФЛПолуч' $nd_svmk = 'СвВыплМК' $nd_psfl = 'ПерсСвФЛ' $fio = 'ФИО' $kv = @('21','31','33','34') $arr1162_i, $arr1111 = @(),@() # Основной код dir $path -filt $flt -file|%{ $x = [xml](gc $_.fullname -enc $enc) $tmp = get-nodeattrdoc $x $nd $enc $knd = $tmp.кнд $per = $tmp.период $ndo = @{XML=$x;PER=$per;FIO=$fio;ENC=$enc;KND=$knd} if ($knd -eq '1151111'){ $arr1111 += get-nodedataout @ndo -node $nd_pssl -pnode $nd_dfl -d $nd_svmk } else { $arr1162_i += get-nodedataout @ndo -node $nd_psfl } } #Получаем список кодов периодов помесячно: $m = 1.. 12|%{"$_".padleft(2,'0')} # Суммируем помесячные документы на одно лицо (единый ИННФЛ) в единую строку: $arr1162 = $arr1162_i|group -prop 'иннфл'|%{get-sumdoc1162 $_.group $m} # Экспорт в CSV файлы $arr1162|sort 'ФИО'|export-csv '1162.csv' @csv $arr1111|sort 'ФИО'|export-csv '1111.csv' @csv # Вывод в консоль общей таблицы: $arr1111+$arr1162|sort 'ФИО','КНД'|ft * -a -w # Получение различий с индикаторами: diff $arr1111 $arr1162 -prop "ФИО","ИННФЛ",'СумГод','01','02', '03','04','05','06','07','08','09','10','11','12'|export-csv 'diff.csv' @csv Формируются два выходных файла с данными в CSV формате, плюс CSV-файл с различиями в данных, если таковые обнаружатся - файл хоть и один, но у каждой строки будет индикатор из какого массива получены данные: "<=" - ReferenceObject и "=>" - DifferenceObject |
|||
------- Последний раз редактировалось YuS_2, 29-10-2023 в 17:56. Отправлено: 17:31, 29-10-2023 | #23 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
На выборочных данных работает в среднем на 100-150 миллисекунд быстрее (проверку СНИЛС в diff добавить не составило труда ![]() |
|
Отправлено: 18:44, 29-10-2023 | #24 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 19:33, 29-10-2023 | #25 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Спаcибо, но достаточно *.csv для табличного редактора "Excel". |
|
Отправлено: 19:37, 29-10-2023 | #26 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Анализ элементов числового массива | kelevara | Скриптовые языки администрирования Windows | 8 | 08-05-2013 16:40 | |
C/C++ - Подсчет суммы положительных элементов массива | antoiiika | Программирование и базы данных | 2 | 19-11-2011 05:20 | |
PowerShell - Вывод нумерации элементов массива в консоль | tarasov.evgeny | Скриптовые языки администрирования Windows | 0 | 12-04-2011 13:36 | |
C/C++ - [решено] Найти среднее геометрическое элементов массива А (С++) | kmi567 | Программирование и базы данных | 2 | 10-12-2010 05:06 | |
С/С++ | Выбор 10 случайных элементов из массива | Vovius | Программирование и базы данных | 5 | 29-08-2006 19:37 |
|