![]() |
Вывод элементов списка в виде массива
Уважаемые, здравствуйте!
Задалcя вопросом обработки *.xml файлов, вроде бы даже добился какого-никакого решения поставленной перед Собою задачи, но вот одного не могу разрешить: вывод элемента списка в виде массива, Powershell его "подрезает" и отображает только несколько первых символов. Список объявляю так: Код:
$list2 = New-Object System.Collections.Generic.List[System.Object]; Код:
$aSumItog = @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); Код:
cFIO cSum Может, кто подскажет как этого добиться? |
Код:
... | Format-Table 'cFIO', @{ Label='cSum'; Expression={ $_.cSum -join ', ' } } |
еще есть вариант перестать рассчитывать на нативные типы повершелла и просто как JSON выводить данные
Код:
$list2 | convertto-json -depth 10 Код:
{ |
Цитата:
Цитата:
Вчера уже выкрутился созданием нового списка и впихиванием в него элементов массива, да, топорно получилось. |
Код:
$aSumItog -join "`n" |
Цитата:
один из вариантов: Код:
[string]$aSumItog |
Цитата:
Поставленный вопрос решил, но очень мало опыта работы с powershell, практически нулевой. Но, желаемого достиг, правда с излишним быдлокодом, да (стесняюсь полностью код выложить, там полный атас). Поделюсь, может гуру, при желании, подскажут, как это упростить? Пару блоков, которые Мне кажутся излишними, но не знаю как их упростить: 1. В этом пункте требуется получить список $list1 с уникальными текстовыми значениями и инициализированным массивом чисел. Наполняю два списка данными из *.xml, $tmplist1 используется как временный, для сортировки. В $list1 и $list3 производится работа с массивом числовых значений: Код:
#Основные массивы-списки для всех требуемых значений 2. Как итог выполнения всего кода, наполненный рабочий список $list1 требуется вывести в *.csv с разделителем [char]9, т.е. сформировать табличную часть. Реализовал, опять же, с использованием дополнительного списка, где наполняю этот список: Код:
$tmplist3 = [System.Collections.Generic.List[string]]::new() Код:
$tmplist3 | Out-File 'КНД_1151111.csv' |
Цитата:
Цитата:
Т.е. нужен пример файла (а лучше файлов) с исходными данными (конфиденциальную инфу можно заменить какими-нибудь фейками) и желаемый результат, т.е. то, что необходимо получить из исходных данных. Промежуточные "просмотры" данных в консоли, не имеют смысла обычно, но если сильно желание, то тоже надо бы указать в каком виде хочется их просматривать. |
Вложений: 1
Цитата:
Сверка заключается в том, что бы проверить соответствие всех перс.данных по физ.лицам отражённых в трёх месячных формах 1151162 с квартальной формой 1151111. Для этого, эти перс.данные из *.xml файлов извлекаются, помещаются в списки, а списки уже построчно сравниваются; Цитата:
Заменил и приложил; Цитата:
|
Цитата:
Цитата:
И да, судя по файлам, количество элементов (и атрибутов элементов тоже) в них различное... а могут быть ещё какие-нибудь поля, которых нет в примерах? Если парсить xml, то нужны будут наименования элементов, по которым необходимо делать выборку... или там просто всё подряд, что найдем, то и "выплюнуть" на выход? |
Вложений: 1
Цитата:
UPD: Перезалил файл по причине добавления комментариев к сценарию. |
Придирки по коду :-).
$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 |
Цитата:
Цитата:
Цитата:
|
Цитата:
|
|
Цитата:
В общем, я предупреждал, что без алгоритма действий, результат может выйти совсем не таким, каким ожидался... :) script.ps1 (кодировку скрипта лучше выбрать UTF8) Код:
function Get-NodeAttrDoc ($xml,$node,$enc){ |
Цитата:
Круто! |
Цитата:
Цитата:
Цитата:
Цитата:
|
Вложений: 1
Цитата:
Цитата:
Код:
#Выполним сверку между отчётами и результат сохраним в файл Цитата:
Цитата:
Цитата:
Код:
if ($item3.cMes -ne $null) {} Цитата:
|
Цитата:
Цитата:
Код:
New-Object System.Collections.Generic.List[System.Object] А на счет сверки двух отчетных форм... что именно сверяется? Вы же не думаете, что скилл телепатии у меня настолько развит? :) По Вашим примерам понятно, что есть два вида форм, одна из которых содержит данные за месяц, другая за квартал... так вот каким образом Вам необходимо их сверять? Помесячно, поквартально, за год, за пятилетку и т.д. Т.е. технически сверку сделать - вообще, не проблема. Тут важно получить данные и получить их в том виде, который требуется... Цитата:
У нас, например, не в рублях и нет никаких копеек... Далее... Цитата:
Мой код опирался, помимо основной, больше на вот эту задачу (собственно, в первом сообщении, это и было главным вопросом): Цитата:
Основной скелет кода составлен, но для доведения этого кода "до ума", необходимо таки уточнение многих моментов, которые было бы неплохо описать в виде: 1. Вот исходные файлы, на одного-два-три-...-n физлиц. 2. Из них необходимо получать вот такие вот две формы (суммы ли в тех формах должны быть, либо только отдельные данные, сведенные по ИННФЛ или по какому-то ещё признаку, что-то ещё важное...). 3. В общем, сами эти итоговые формы, вернее их содержание, для сверки (опять же по нескольким физлицам), которые должны получиться из исходных данных, необходимо "нарисовать" вручную. А также требующийся формат конечных, выходных файлов, тоже было бы неплохо указать. Так будет проще составить парсер, который будет делать то, что от него требуется. По новым примерам было, конечно, проще поправить код... но непонятно, как могут возникать различия при сверке, т.к. Вашим кодом они не обнаружены. В том смысле, что вроде бы нужны ещё и четкие примеры таких различий в исходных данных, которые требуется обнаруживать сверкой. Вот код, в котором можно легко сделать сверку по тем данным, которые Вы предоставили, но за один квартал. Не обращайте внимание, что нет выходных файлов сверки (это организовать несложно), смотрите в консоль, там можете визуально сравнивать данные, сгруппированные по ИННФЛ. В версии powershell 5.1 автоматическое преобразование типов сделает вывод целых чисел, без нулей после запятой (при желании можно сделать принудительную типизацию), а в версии PS 7.3.6, все числа будут выведены, как [double] Код:
function Get-NodeAttrDoc ($xml,$node,$enc){ |
Да, совсем забыл:
код просто подкорректирован для наличия нескольких однотипных элементов в одном файле, но считать может пока неверно... т.е. его ещё надо проверять. |
Цитата:
Цитата:
Скрытый текст
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Примерно так: Код:
# Функция получения кода документа и периода (месяц/квартал) Формируются два выходных файла с данными в CSV формате, плюс CSV-файл с различиями в данных, если таковые обнаружатся - файл хоть и один, но у каждой строки будет индикатор из какого массива получены данные: "<=" - ReferenceObject и "=>" - DifferenceObject |
Цитата:
На выборочных данных работает в среднем на 100-150 миллисекунд быстрее (проверку СНИЛС в diff добавить не составило труда :) ). |
NickM, а, да, забыл совсем... есть ещё более наглядная визуализация табличных данных.
Замените код здесь: Код:
$arr1111+$arr1162|sort 'ФИО','КНД'|ft * -a -w Код:
$arr1111+$arr1162|sort 'ФИО','КНД'|ogv |
Цитата:
Спаcибо, но достаточно *.csv для табличного редактора "Excel". |
Время: 19:13. |
Время: 19:13.
© OSzone.net 2001-