![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 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 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
UPD: Перезалил файл по причине добавления комментариев к сценарию. |
|
Последний раз редактировалось NickM, 27-10-2023 в 15:47. Отправлено: 15:24, 27-10-2023 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 136
|
Профиль | Сайт | Отправить PM | Цитировать Придирки по коду :-).
$list1 = New-Object System.Collections.Generic.List[System.Object]; $list3 = New-Object System.Collections.Generic.List[System.Object]; Можно на это поменять using namespace System.Collections.Generic $list1 =[List[string]]@() $list3 =[List[string]]@() Табуляцию [char]9 на "`t" Причём вы тут $tmplist3.Add($item.cFIO + [char]9 + $item.cINN + [char]9 + $item.cSNILS + [char]9 + ($item.cSum -join "`t") используте "`t", но зачем-то и [char]9 вот это $list3.Add([PSCustomObject]@{cPeriod = $cPeriod; cFIO = $cFIO; cINN = $cINN; cSNILS = $cSNILS; cmes = $cMes; cSum = $cSum}); на это и в конце строки ; не нужна. $list3.Add([PSCustomObject]@{cPeriod = $cPeriod; cFIO = $cFIO; cINN = $cINN; cSNILS = $cSNILS; cmes = $cMes; cSum = $cSum; } ) Это чисто удобство чтения. Кодировку добавить. $tmplist3 | Out-File 'КНД_1151111.csv' -Encoding utf8 |
------- Отправлено: 15:25, 27-10-2023 | #12 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:32, 27-10-2023 | #13 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата NickM:
|
|
------- Отправлено: 18:43, 27-10-2023 | #14 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать |
Отправлено: 18:45, 27-10-2023 | #15 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата NickM:
В общем, я предупреждал, что без алгоритма действий, результат может выйти совсем не таким, каким ожидался... ![]() script.ps1 (кодировку скрипта лучше выбрать UTF8) function Get-NodeAttrDoc ($xml,$node,$enc){ process{ $n = $xml.selectnodes("//$node") [pscustomobject]@{ 'КНД' = $n.кнд 'Период' = $n.период } } } function Get-NodeDataOut ($xml,$node,$per,$dat,$fio,$enc,$knd){ process{ $t = $xml.selectnodes("//$node") $f = $t.$fio $s = @(@(0)*13) if (($i=[int]$per) -lt 13){$s[$i] = [int]$t.сумвыпл} else { $sv = [int[]]$xml.selectnodes("//$dat").сумвыпл 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 ' ' 'ИННФЛ' = $t.иннфл 'СНИЛС' = $t.снилс 'СумГод' = [int]$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] } } } function get-sumdoc1162 ($elem,$i){ $b = $i|%{($elem.$_|measure -sum).sum} [pscustomobject]@{ 'КНД' = $elem.кнд[0] 'ФИО' = $elem.фио[0] 'ИННФЛ' = $elem.иннфл[0] 'СНИЛС' = $elem.снилс[0] 'СумГод' = [int]($b|measure -sum).sum '01' = [int]$b[0] '02' = [int]$b[1] '03' = [int]$b[2] '04' = [int]$b[3] '05' = [int]$b[4] '06' = [int]$b[5] '07' = [int]$b[6] '08' = [int]$b[7] '09' = [int]$b[8] '10' = [int]$b[9] '11' = [int]$b[10] '12' = [int]$b[11] } } $path = $psscriptroot if ($host.version.major -gt 5) { $enc = 'windows-1251' $csv = @{ Encoding = 'utf8' NoTypeInformation = $true QuoteFields = 'ФИО' } } else { $enc = 'default' $csv = @{ Encoding = 'utf8' NoTypeInformation = $true } } $flt = 'NO_*.xml' $nd = 'Документ' $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.период if ($knd -eq '1151111'){ $arr1111 += get-nodedataout -xml $x -node $nd_dfl -per $per -d $nd_svmk -f $fio -enc $enc -knd $knd } else { $arr1162_i += get-nodedataout -xml $x -node $nd_psfl -per $per -f $fio -enc $enc -knd $knd } } $m = 1.. 12|%{"$_".padleft(2,'0')} $arr1162 = $arr1162_i|group -prop 'иннфл'|%{get-sumdoc1162 $_.group $m} $arr1162|sort 'ФИО'|export-csv '1162.csv' @csv $arr1111|sort 'ФИО'|export-csv '1111.csv' @csv $arr1111+$arr1162|sort 'ФИО'|ft * -a -w |
|
------- Отправлено: 18:18, 28-10-2023 | #16 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Круто! |
|
Отправлено: 21:36, 28-10-2023 | #17 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата NickM:
![]() Цитата NickM:
Цитата NickM:
Цитата NickM:
|
||||
------- Отправлено: 22:26, 28-10-2023 | #18 |
Ветеран Сообщения: 4635
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Цитата NickM:
#Выполним сверку между отчётами и результат сохраним в файл $tmplist4 | ?{$tmplist3 -notcontains $_} | Out-File 'Отсутствуют_в_КНД_1151111.csv'; $tmplist3 | ?{$tmplist4 -notcontains $_} | Out-File 'Отсутствуют_в_КНД_1151162.csv'; Цитата YuS_2:
Цитата:
Цитата YuS_2:
Цитата YuS_2:
|
||||||
Отправлено: 22:49, 28-10-2023 | #19 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата NickM:
Цитата YuS_2:
для чего? Чем обычные массивы не устроили? А на счет сверки двух отчетных форм... что именно сверяется? Вы же не думаете, что скилл телепатии у меня настолько развит? ![]() По Вашим примерам понятно, что есть два вида форм, одна из которых содержит данные за месяц, другая за квартал... так вот каким образом Вам необходимо их сверять? Помесячно, поквартально, за год, за пятилетку и т.д. Т.е. технически сверку сделать - вообще, не проблема. Тут важно получить данные и получить их в том виде, который требуется... Цитата NickM:
![]() У нас, например, не в рублях и нет никаких копеек... Далее... Цитата NickM:
Мой код опирался, помимо основной, больше на вот эту задачу (собственно, в первом сообщении, это и было главным вопросом): Цитата NickM:
Основной скелет кода составлен, но для доведения этого кода "до ума", необходимо таки уточнение многих моментов, которые было бы неплохо описать в виде: 1. Вот исходные файлы, на одного-два-три-...-n физлиц. 2. Из них необходимо получать вот такие вот две формы (суммы ли в тех формах должны быть, либо только отдельные данные, сведенные по ИННФЛ или по какому-то ещё признаку, что-то ещё важное...). 3. В общем, сами эти итоговые формы, вернее их содержание, для сверки (опять же по нескольким физлицам), которые должны получиться из исходных данных, необходимо "нарисовать" вручную. А также требующийся формат конечных, выходных файлов, тоже было бы неплохо указать. Так будет проще составить парсер, который будет делать то, что от него требуется. По новым примерам было, конечно, проще поправить код... но непонятно, как могут возникать различия при сверке, т.к. Вашим кодом они не обнаружены. В том смысле, что вроде бы нужны ещё и четкие примеры таких различий в исходных данных, которые требуется обнаруживать сверкой. Вот код, в котором можно легко сделать сверку по тем данным, которые Вы предоставили, но за один квартал. Не обращайте внимание, что нет выходных файлов сверки (это организовать несложно), смотрите в консоль, там можете визуально сравнивать данные, сгруппированные по ИННФЛ. В версии powershell 5.1 автоматическое преобразование типов сделает вывод целых чисел, без нулей после запятой (при желании можно сделать принудительную типизацию), а в версии PS 7.3.6, все числа будут выведены, как [double] function Get-NodeAttrDoc ($xml,$node,$enc){ process{ $n = $xml.selectnodes("//$node") [pscustomobject]@{ 'КНД' = $n.кнд 'Период' = $n.период } } } function Get-NodeDataOut ($xml,$node,$per,$dat,$fio,$enc,$knd){ process{ $tarr = $xml.selectnodes("//$node") $out = foreach($t in $tarr){ $f = $t.$fio $s = @(@([double]0)*13) if (($i=[int]$per) -lt 13){$s[$i] = [double]$t.сумвыпл} else { $sv = [double[]]$xml.selectnodes("//$dat").сумвыпл 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 ' ' 'ИННФЛ' = $t.иннфл 'СНИЛС' = $t.снилс 'СумГод' = $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_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_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} $arr1162|sort 'ФИО'|export-csv '1162.csv' @csv $arr1111|sort 'ФИО'|export-csv '1111.csv' @csv $arr1111+$arr1162|sort 'ФИО'|ft * -a -w |
|||||
------- Последний раз редактировалось YuS_2, 29-10-2023 в 12:42. Отправлено: 12:23, 29-10-2023 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|