我有以下列表:
$list = @('PONTEVEDRA:false:siAPP','MADRID:true:noAPP','MADRID:true:noAPP','PONTEVEDRA:true:siAPP')
我想生成另一个包含以下内容的列表:
$transformedList = @('PONTEVEDRA:1:1:2:0','MADRID:2:1:3:0')
其中 {0} 是位置 {1} 真实的总数 {2} 虚假的总数 {3} siAPP 的总数和 {4} 是 noAPP 的总数
我怎么能在PowerShell中做到这一点?
我认为Group-Object(别名:group)是执行此任务的命令 cmdlet。
这是一种方法:
编辑:包括摘要信息
如果您分解上面的代码以查看管道中的内容,您将看到以下代码段:
创建这些对象:
其中,如果按 分组
Bool
,将获得“真”和“假”的总数:所以要捕获中间对象,修改原始代码创建另一个集合。本段:
变成这样:
然后,当您运行修改后的代码时,您不仅创建了
$NewList
,而且$SumList
还创建了 . 有了它,您可以分组并选择:因此,完整修改后的代码将是:
Edit3:替代总结方法:
如果您需要进一步访问对象形式的原始数据,上述内容会很好,但如果您只需要提到的总和,则以下内容可能会更有效和更快。它不会创建另一个集合或列表,而是用于引用变量以在处理数据时保持运行总计:
编辑#2:附加数据
和以前一样,您要做的第一件事是将数据转换为对象。这次我采取了稍微不同的方法——不是为了混淆,而是为了展示另一种方法。如果您的数据实际上来自文件,您将使用
Import-Csv
而不是ConvertFrom-Csv
:产生:
再次,分组
**Loc**
:并且利用这些
Group
属性中的每一个,我们可以使用集合可用的Where
方法提取您想要的数据:输出:
请注意,因为
Where()
即使有零个或一个元素,该方法也会返回一个集合——而且因为集合有Count
自己的属性,所以您必须指定[0]
数组索引才能Count
从BoolGroup
和AppGroup
子组中获取。没有它,Count
只会返回0
或1
-- 取决于指定分组中是否有任何元素。