如何执行算术运算以查找两个 CSV 中的值差异?

How can I perform arithmetic to find differences of values in two CSVs?

我能够区分两个 CSV 的内容 ("cells"),并使用以下函数获得最高值的输出:

Compare-Object $oldfile $latestfile -Property  "UsedSize" -PassThru |  select-Object  "VolumeName", "UsedSize" | export-csv c:\kits\_write\snapshots\voldelta.csv -NoTypeInfo

但是,我希望得到单元格中值之间的 delta/difference。

是否可以通过算术运算找出两个 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

我通过使用类似以下内容找到了 "lead":

$combocsv = $oldfile + $latestfile
$combocsv | group VolumeName | select name,@{Name="Totals";Expression={($_.group | Measure-Object -sum UsedSize).sum}}

除了我需要用 measure-object 计算差值而不是求和。我在查找如何执行此操作时遇到了一些问题。

根据解决!

$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)
}

导入的 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
  #
}