Цитата 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