如何将多维数组/哈希表当作数据库表执行SELECT-WHERE等查询?(PowerShell)
嘿,这个需求在PowerShell里完全能搞定,不用发愁!咱们可以利用PowerShell天生的对象处理能力,搭配Group-Object、Measure-Object这些内置cmdlet,把多维数组或哈希表当成“内存数据库”来实现类似SQL的查询、分组和汇总操作。我结合你的需求(按首字段分组、汇总SD开头的行)给你举几个实用的例子:
第一步:把原始数据转成PowerShell对象
不管你是从文件读取的行数据,还是现成的多维数组,先把它们转成自定义对象是最方便的——因为PowerShell对对象的筛选、分组操作特别顺手。比如假设你的原始数据是每行用逗号分隔的文本:
# 模拟从文件读取的原始数据(实际可以用 Get-Content 读取) $rawData = @( "GroupA,10,20", "SD-001,5,15", "GroupA,30,40", "SD-002,8,12", "GroupB,15,25", "SD-001,7,13" ) # 把每行拆分成字段,转成带属性的对象 $dataObjects = $rawData | ForEach-Object { $fields = $_ -split ',' [PSCustomObject]@{ GroupKey = $fields[0] # 首字段作为分组键 Num1 = [int]$fields[1] Num2 = [int]$fields[2] } }
实现类似SQL的操作
1. 筛选(WHERE):只保留SD开头的行
就像SQL里的WHERE GroupKey LIKE 'SD%',用Where-Object就能轻松筛选:
$sdOnlyRows = $dataObjects | Where-Object { $_.GroupKey -match '^SD' }
2. 分组(GROUP BY)+ 汇总(SUM/COUNT)
按首字段分组,同时统计每组的行数(COUNT)和数值总和(SUM),等效于SQL的GROUP BY + 聚合函数:
# 全部分组的汇总 $fullSummary = $dataObjects | Group-Object -Property GroupKey | ForEach-Object { # 计算每组的Num1、Num2总和 $sumNum1 = ($_.Group | Measure-Object -Property Num1 -Sum).Sum $sumNum2 = ($_.Group | Measure-Object -Property Num2 -Sum).Sum # 输出自定义汇总对象 [PSCustomObject]@{ GroupName = $_.Name EntryCount = $_.Count TotalNum1 = $sumNum1 TotalNum2 = $sumNum2 } } # 只汇总SD开头的分组(先筛选再分组) $sdSummary = $sdOnlyRows | Group-Object -Property GroupKey | ForEach-Object { [PSCustomObject]@{ SDCode = $_.Name TotalNum1 = ($_.Group | Measure-Object -Property Num1 -Sum).Sum TotalEntries = $_.Count } }
3. 导出到汇总文件
最后把汇总结果导出成CSV格式(方便后续查看或处理):
# 导出全部分组汇总 $fullSummary | Export-Csv -Path "FullGroupSummary.csv" -NoTypeInformation -Encoding UTF8 # 导出SD分组汇总 $sdSummary | Export-Csv -Path "SDSummary.csv" -NoTypeInformation -Encoding UTF8
小贴士:如果原始数据是哈希表怎么办?
如果你的数据一开始就是哈希表结构,也可以先转成对象再处理:
# 模拟哈希表数据 $hashData = @{ "GroupA" = @(10, 30) "SD-001" = @(5, 7) "GroupB" = @(15) } # 把哈希表转成对象 $hashObjects = $hashData.GetEnumerator() | ForEach-Object { [PSCustomObject]@{ GroupKey = $_.Key Values = $_.Value } } # 然后同样可以做汇总 $hashSummary = $hashObjects | ForEach-Object { [PSCustomObject]@{ GroupKey = $_.GroupKey TotalValue = ($_.Values | Measure-Object -Sum).Sum EntryCount = $_.Values.Count } }
这些都是PowerShell原生的功能,不用额外装插件,你可以根据自己的实际数据结构调整字段名和逻辑,多试几次就能熟练啦!
内容的提问来源于stack exchange,提问作者Björn H. Sandvik
相关产品推荐
相关产品推荐

