powershell - (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.Sum
Property 只能返回一个Nullable<Double>
实例作为属性值。
似乎我正在产生溢出[double]
,因为显示的数字完全错误。我想坚持使用十进制或整数,所以我有类似71123.4
或类似的输出。
有没有其他方法,所以我不必使用(Measure-Object -sum).Sum
?
提前致谢!
解决方案
我首先将所有发件人地址分组在一起,然后将它们单独汇总:
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
}
}
推荐阅读
- c# - 本地计算机上的自托管 WebAPI,支持 https
- google-cloud-firestore - Firestore 触发器函数的跟踪上下文(分布式跟踪)
- android - 如何取消 Firebase 存储元数据下载任务?
- c# - 我无法检查玩家是否在冲刺
- r - glmnet 包中的“standardize =”选项
- c# - 正则表达式区分第一和街道 c# regex.replace
- selenium - Selenium Flask 在本地运行良好时无法在 Heroku 上运行
- javascript - 移除 headlessUi 芯片
- python - 将编码的 .txt 文件导入 Python 3
- c# - 有没有办法为 ac#soap 服务动态分配命名空间?