重新排列和组合powershell自定义对象



我有一个系统,它当前从将被替换的单独系统生成的CSV文件中读取数据。

导入的CSV文件看起来像这个

PS>导入Csv。\销售价值.csv销售价值AA BB-----------——--10 6 55 3 43 1 9

为了替换这个过程,我希望生成一个看起来与上面的CSV相同的对象,但我不想继续使用CSV文件。

我已经有了一个脚本,可以从数据库中读取数据并提取我需要使用的数据。我不会详细说明这一点之前的相当长的脚本,但实际上它看起来是这样的:

$SQLData = Custom-SQLFunction "SELECT * FROM SALES_DATA WHERE LIST_ID = $LISTID"

$SQLData将包含我需要查询的5000多个DataRow对象。

其中一个DataRow对象看起来像这样:

lead_id:123456789进入日期:2018年10月26日16:51:16修改日期:2018年1月11日01:00:02状态:错误用户:mrexample供应商_代码:TH1S15L0NGC0D3源id:A543212list_id:333004list_name:AA一些文本gmt_offset_now:0.00SaleValue:10

list_name将以AABB为前缀。

SaleValue可以是3及以上的任何整数,但实际上极不可能高于100(因为这是每月捐赠(,并且在绝大多数情况下会是3,5,10之一。

我已经有了一个脚本,它接受list_name的内容,创建并将我需要使用的数据填充到两个单独的psobject($AASalesValues$BBSalesValues(中,这两个psobject整理了整个数据集的"SaleValue"总数。

因为我不能可靠地预测任何SaleValue的值,所以我必须动态地创建像这样的psobjects属性

foreach ($record in $SQLData) {
if ($record.list_name -match "BB") {
if ($record.SaleValue -gt 0) {
if ($BBSalesValues | Get-Member -Name $($record.SaleValue) -MemberType Properties) {
$BBSalesValues.$($record.SaleValue) = $BBSalesValues.$($record.SaleValue)+1
} else {
$BBSalesValues | Add-Member -Name $($record.SaleValue) -MemberType NoteProperty -Value 1
}
}
}    
}

生成的两个对象如下所示:

PS>$AASalesValues10 5 3 50------17 14 3 1PS>$BB销售价值3 10 5 4----36 12 11 1

我现在有了我需要的数据,但我需要以复制CSV格式的方式对其进行格式化,这样我就可以将其直接传递给另一个现有的powershell脚本,该脚本被配置为期望数据采用CSV的格式,但我不想将数据写入文件。

我更愿意将此直接传递到脚本的下一部分。

最终,我想做的是生成一个新的对象/一些输出,它看起来像是本文顶部Import-Csv命令的输出。

我想要一个新的对象,比如$OverallSalesValues,看起来像这样:

PS>$overallSalesValues销售价值AA BB50 1 010 17 125 14 114 0 13 3 36

在上面的例子中,$AASalesValues的值列在AA列下,$BBSalesValues的值列出在BB列下,行与两个原始对象的标题匹配。

我确实在哈希表中尝试过,但我无法找到如何从动态值创建它们,并将它们格式化为我需要的样子。

终于到达了那里。

$TotalList = @()
foreach($n in 3..200){
if($AASalesValues.$n -or $BBSalesValues.$n){
$AACount = $AASalesValues.$n
$BBcount = $BBSalesValues.$n
$values = [PSCustomObject]@{
'Sale Value'= $n
AA = $AACount
BB = $BBcount
}
$TotalList += $values
}
}
$TotalList

产生的输出

Sale Value AA BB
---------- -- --
3  3 36
4     2
5 14 11
10 18 12
50  1   

只需要添加一个位来包括"0"值,而不是$null。

我假设$record包含$AASalesValues$BBSalesValues的数据库结果列表,而不是两者都包含,否则您需要某种选择器来避免将一个组的记录与另一组的记录进行计数。

按照LotPings建议的SaleValue属性对记录进行分组:

$BBSalesValues = $record | Group-Object SaleValue -NoElement

这将为您提供一个SaleValue值及其各自计数的列表。

PS>$BBSalesValues计数名称---------36 312 1011 51 4

然后您可以使用以下值更新CSV数据:

$file = 'C:pathtodata.csv'
# read CSV into a hashtable mapping the sale value to the complete record
# (so that we can lookup the record by sale value)
$csv = @{}
Import-Csv $file | ForEach-Object {
$csv[$_.'Sale Values'] = $_
}
# Add records for missing sale values
$($AASalesValues; $BBSalesValues) | Select-Object -Expand Name -Unique | ForEach-Object {
if (-not $csv.ContainsKey($_)) {
$csv[$_] = New-Object -Type PSObject -Property @{
'Sale Values' = $_
'AA'          = 0
'BB'          = 0
}
}
}
# update records with values from $AASalesValues
$AASalesValues | ForEach-Object {
[int]$csv[$_.Name].AA += $_.Count
}
# update records with values from $BBSalesValues
$BBSalesValues | ForEach-Object {
[int]$csv[$_.Name].BB += $_.Count
}
# write updated records back to file
$csv.Values | Export-Csv $file -NoType

即使有了更新的问题,方法也基本相同,您只需要添加另一个级别的分组来收集销售数字:

$sales = @{}
$record | Group-Object {$_.list_name.Split()[0]} | ForEach-Object {
$sales[$_.Name] = $_.Group | Group-Object SaleValue -NoElement
}

然后将合并调整为这样:

$file = 'C:pathtodata.csv'
# read CSV into a hashtable mapping the sale value to the complete record
# (so that we can lookup the record by sale value)
$csv = @{}
Import-Csv $file | ForEach-Object {
$csv[$_.'Sale Values'] = $_
}
# Add records for missing sale values
$sales.Values | Select-Object -Expand Name -Unique | ForEach-Object {
if (-not $csv.ContainsKey($_)) {
$prop = @{'Sale Values' = $_}
$sales.Keys | ForEach-Object {
$prop[$_] = 0
}
$csv[$_] = New-Object -Type PSObject -Property $prop
}
}
# update records with values from $sales
$sales.GetEnumerator() | ForEach-Object {
$name = $_.Key
$_.Value | ForEach-Object {
[int]$csv[$_.Name].$name += $_.Count
}
}
# write updated records back to file
$csv.Values | Export-Csv $file -NoType

最新更新