我能够对两个CSV的内容(“单元格”)进行区分,并使用以下函数获得最高值的输出:
Compare-Object $oldfile $latestfile -Property "UsedSize" -PassThru | select-Object "VolumeName", "UsedSize" | export-csv c:\kits\_write\snapshots\voldelta.csv -NoTypeInfo
但是,我希望获得单元格中值之间的差异/差异。
是否可以执行算术来查找两个CSV中值的差异?
为了提供上下文,我们正在增加NetApp卷快照计划,例如,从6小时增加到15分钟。我想从时间N
到时间N+15 minutes
开始收集增量,以便在我们实施更改之前找出卷上数据的所有增长率(当然包括快照) 。是的,snap delta
是用于为现有快照生成此内容的Data ONTAP方法。
由于
[关于评论的更新]
文件A:
VolumeName,TotalSize,AvailableSize,UsedSize
netapp_vol1,375809648400,101430421264,274379237136
文件B:
VolumeName,TotalSize,AvailableSize,UsedSize
netapp_vol1,375809638400,101430456320,274379182080
我通过使用以下内容找到了“领先”:
$combocsv = $oldfile + $latestfile
$combocsv | group VolumeName | select name,@{Name="Totals";Expression={($_.group | Measure-Object -sum UsedSize).sum}}
除了我需要与measure-object
执行差异而不是求和。我在找到如何做到这一点时遇到了一些麻烦。
根据the selected answer below解决!
$oldfilecsv = @{}
$oldfile = import-csv "C:\kits\_write\snapshots\filera_version.csv" | foreach-object { $oldfilecsv[$_.VolumeName] = [long]$_.UsedSize }
$latestfilecsv = @{}
$latestfile = import-csv "C:\kits\_write\snapshots\filera_latest.csv" | foreach-object { $latestfilecsv[$_.VolumeName] = [long]$_.UsedSize }
$deltas = @{}
foreach ( $volume in $latestfilecsv.keys ) {
$delta = $latestfilecsv[$volume] - $oldfilecsv[$volume]
$deltas.add($volume, $delta)
}
答案 0 :(得分:2)
导入的CSV值是字符串,因此您可能需要将值转换为适当的类型,例如计算属性:
$csv = Import-Csv 'C:\path\to\input.csv' |
Select-Object VolumeName, @{n='UsedSize';e={[long]$_.UsedSize}}
上面用一个具有相同名称的属性替换了(string)属性UsedSize
,但是将字符串强制转换为一个长整数值。
但是,由于您要计算两个不同文件之间的增量,我建议将数据导入哈希表,而不是直接导入CSV:
$csv = @{}
Import-Csv 'C:\path\to\input.csv' | ForEach-Object {
$csv[$_.VolumeName] = [long]$_.UsedSize
}
这将使您能够查找任何给定音量的值。
使用不同哈希表中输入CSV的数据,您可以轻松计算出如下差异:
foreach ($volume in $csv1.Keys) {
$delta = $latestCsv[$volume] - $oldCsv[$volume]
#
# further processing goes here, like displaying $delta on the screen
# or putting the value in another hashtable
#
}