Как сгруппировать результаты SQL DataRow по Имени в зависимости от условия - PullRequest
0 голосов
/ 22 октября 2019

Я получаю результаты из таблицы SQL с помощью этой команды:

$GetData = Invoke-Sqlcmd -ConnectionString $Connection -Query $GetQuery

Один отдельный результат выглядит следующим образом (их около 500):

ID                  : 1584
ObjId               : 
ARTIKEL_NR          : 0
ArtBeschrieb1_3     : 
KLASSE              : TbXAusführungen
SMB1                : Produkt
SMW1                : TbA
SMN1                : 
SMB2                : Ausführung
SMW2                : 2M-Zarge Front
SMN2                : 
SMB3                : Boxtypen
SMW3                : B;C-M;D-M
SMN3                : 
SMB4                : SortKZ
SMW4                : 
SMN4                : 2.000000
SMB5                : 
SMW5                : 
SMN5                : 
SMB6                : 
SMW6                : 
SMN6                : 
SMB7                : 
SMW7                : 
SMN7                : 
SMB8                : 
SMW8                : 
SMN8                : 
SMB9                : 
SMW9                : 
SMN9                : 
SMB10               : 
SMW10               : 
SMN10               : 
SMB11               : 
SMW11               : 
SMN11               : 
SMB12               : 
SMW12               : 
SMN12               : 
SMB13               : 
SMW13               : 
SMN13               : 
SMB14               : 
SMW14               : 
SMN14               : 
SMB15               : 
SMW15               : 
SMN15               : 
SMB16               : 
SMW16               : 
SMN16               : 
SMB17               : 
SMW17               : 
SMN17               : 
SMB18               : 
SMW18               : 
SMN18               : 
SMB19               : 
SMW19               : 
SMN19               : 
SMB20               : 
SMW20               : 
SMN20               : 
SMB21               : 
SMW21               : 
SMN21               : 
SMB22               : 
SMW22               : 
SMN22               : 
SMB23               : 
SMW23               : 
SMN23               : 
SMB24               : 
SMW24               : 
SMN24               : 
SMB25               : 
SMW25               : 
SMN25               : 
SMB26               : 
SMW26               : 
SMN26               : 
SMB27               : 
SMW27               : 
SMN27               : 
SMB28               : 
SMW28               : 
SMN28               : 
SMB29               : 
SMW29               : 
SMN29               : 
SMB30               : 
SMW30               : 
SMN30               : 
DividendPreisEinhet : 0
SMB31               : 
SMW31               : 
SMN31               : 
ArtBeschrieb1_2FR   : 
SMB32               : 
SMW32               : 
SMN32               : 
OOPreisklasse       : 
SMB33               : 
SMW33               : 
SMN33               : 
SMB34               : 
SMW34               : 
SMN34               : 
SMB35               : 
SMW35               : 
SMN35               : 
SMB36               : 
SMW36               : 
SMN36               : 
SMB37               : 
SMW37               : 
SMN37               : 
SMB38               : 
SMW38               : 
SMN38               : 
SMB39               : 
SMW39               : 
SMN39               : 
SMB40               : 
SMW40               : 
SMN40               : 

Как видите, всегда есть 3 SM* свойств с одинаковым номером. Я хотел бы сгруппировать их. SMB * должен стать именем свойства, а SMW * или SMN * - PropertyValue, в зависимости от того, какое значение равно NULL, а какое нет.

Я думаю, что могу выполнить часть PropertyName / PropertyValue самостоятельно, но как это сделать? Я группирую все соответствующие поля SM *?

btw: Поля, которые не являются полями SM *, уже исправны, они должны оставаться такими, какие они есть.

Я знаю, что $PSObject.Properties, ноэто, кажется, не помогает мне здесь?

PS Z:\Powershell-Scripts> $GetData.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Это было то, что я на самом деле искал - извините, что не объяснил это достаточно хорошо

$GetData = Invoke-Sqlcmd -ConnectionString $ConnectionLogik -Query $GetQuery

$NewData = foreach ($dat in $GetData) 
{
    # Get rid of empty and useless Properties
    $NotArray = @("RowState","ItemArray","HasErrors")
    $Objects = $dat.Psobject.properties | 
      Where-Object {![string]::IsNullOrWhiteSpace($_.Value) -and $_.Name -notin $NotArray} | 
      Select-Object Name, Value 

    # Create new Properties from pairs
    $SingleObject = [ordered]@{}
    foreach ($obj in $Objects) {
        if ($obj.Name -like 'SM*') {
            if ($obj.Name -like 'SMW*' -or $obj.Name -like 'SMN*') { Continue }
            $match = 'SM[NW]' + $obj.Name.Substring(3) + '$'
            $val = $Objects | Where-Object { $_.Name -match $match } | Select -Expand Value
            $SingleObject[$obj.Value] = $val
        } else {
            $SingleObject[$obj.Name] = $obj.Value
        }
    }
    [PSCustomObject]$SingleObject
}

Это оставит меня с выводом, подобным этому:

ID                  : 1584
ARTIKEL_NR          : 0
KLASSE              : TbXAusführungen
Produkt             : TbA
Ausführung          : 2M-Zarge Front
Boxtypen            : B;C-M;D-M
SortKZ              : 2.000000
DividendPreisEinhet : 0

ID                  : 443
ObjId               : 20854
ARTIKEL_NR          : 14.39007.00
ArtBeschrieb1_3     : Verpackung
KLASSE              : TbALeistungenAntaro
TextID              : Material.Verpackung
DividendPreisEinhet : 1

ID                  : 1528
ARTIKEL_NR          : 0
KLASSE              : TbXFrontbefestigung
ArtNoBlum           :
Bezeichnung         : keine
DividendPreisEinhet : 0

Кем я был тогдавозможность экспорта в CSV, сгруппированные по каждому свойству KLASSE

$NewData | Group-Object KLASSE | ForEach-Object { $_.Group | Export-Csv I:\TRANSFER\$($_.Name).csv -delimiter ';' -NoTypeInformation }

0 голосов
/ 23 октября 2019

Ниже код должен делать то, что вы хотите:

$GetData = Invoke-Sqlcmd -ConnectionString $Connection -Query $GetQuery

$result = foreach ($item in $GetData) {
    # create an Ordered hash to collect the item data
    $newObject = [ordered]@{}
    # get all property names in order
    $propNames = ($item.PsObject.Properties).Name
    for ($i = 0; $i -lt $propNames.Count; $i++) {
        $name = $propNames[$i]
        if ($name -notlike 'SM*') { 
            $newObject[$name] = $item.$name
        }
        else {
            $num = $name -replace '\D'
            $value = if ([string]::IsNullOrWhiteSpace($item."SMW$num")) { $item."SMN$num" } else { $item."SMW$num" }
            $newObject["SMB$num"] = $value
            $i += 2
        }
    }
    [PsCustomObject]$newObject
}

# output on console
$result

# output to CSV
$result | Export-Csv -Path 'D:\QueryResultCondensed.csv' -NoTypeInformation

Вывод для примера элемента:

ID                  : 1584
ObjId               : 
ARTIKEL_NR          : 0
ArtBeschrieb1_3     : 
KLASSE              : TbXAusführungen
SMB1                : TbA
SMB2                : 2M-Zarge Front
SMB3                : B;C-M;D-M
SMB4                : 2.000000
SMB5                : 
SMB6                : 
SMB7                : 
SMB8                : 
SMB9                : 
SMB10               : 
SMB11               : 
SMB12               : 
SMB13               : 
SMB14               : 
SMB15               : 
SMB16               : 
SMB17               : 
SMB18               : 
SMB19               : 
SMB20               : 
SMB21               : 
SMB22               : 
SMB23               : 
SMB24               : 
SMB25               : 
SMB26               : 
SMB27               : 
SMB28               : 
SMB29               : 
SMB30               : 
DividendPreisEinhet : 0
SMB31               : 
ArtBeschrieb1_2FR   : 
SMB32               : 
OOPreisklasse       : 
SMB33               : 
SMB34               : 
SMB35               : 
SMB36               : 
SMB37               : 
SMB38               : 
SMB39               : 
SMB40               :
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...