首页 > 解决方案 > (Measure-Object -sum).Sum 的替代方案

问题描述

我陷入以下情况:我必须从 CSV 文件中获取信息。我使用Import-Csv.

我的原始数据如下所示:

45227;01.10.2018 03:24:00;Xxxx Xxxx Xxxxx x XX xxxxxxxxxxxxxx Xxxxx xxx Xxxxxxxxxxxxxxxxxxx;;3;XXXX;XXXX;XXX@XX.com;;;3.7;;

其中包含的列3.7是感兴趣的值(“点”)。

这是我的第一个问题-> 使用Import-Csv,powershell 会将这些信息保存在一个[string]属性中。为避免这种情况,我使用了以下行:

| Select @{Name="Points";Expression={[decimal]$_.Points}}

现在我得到一个Selected.System.Management.Automation.PSCustomObject包含该属性的类型对象作为[decimal]. 现在我想总结一下同一个电子邮件地址使用的所有要点:

$Data[$Index].Points += (
  $Imported_CSV | where {$_.Sender -eq $Imported_CSV_Unique.Sender} | 
    measure Points -sum
).Sum

这似乎工作得很好,但如果我打开$Data[$Index] | gm我得到这个:Points NoteProperty double Points=71301.6000000006

属性更改为[double]。我挖了一下,我发现 Powershell 的GenericMeasureInfo.SumProperty 只能返回一个Nullable<Double>实例作为属性值。

似乎我正在产生溢出[double],因为显示的数字完全错误。我想坚持使用十进制或整数,所以我有类似71123.4或类似的输出。

有没有其他方法,所以我不必使用(Measure-Object -sum).Sum

提前致谢!

标签: powershellcsvsummeasure-object

解决方案


我首先将所有发件人地址分组在一起,然后将它们单独汇总:

Import-Csv .\data.csv |Group-Object Sender |ForEach-Object {
    [pscustomobject]@{
        Sender = $_.Name
        SumOfPoints = ($_.Group |Measure-Object Points -Sum).Sum
    }
}

Measure-Object将自动将Points字符串转换为[double]- 如果您需要更高的精度,您可以手动转换为[decimal]之前的样子:

Import-Csv .\data.csv |Select-Object Sender,@{Name="Points";Expression={[decimal]$_.Points}} |Group-Object Sender |ForEach-Object {
    [pscustomobject]@{
        Sender = $_.Name
        SumOfPoints = ($_.Group |Measure-Object Points -Sum).Sum
    }
}

推荐阅读