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

时间:2017-04-17 13:08:16

标签: powershell csv netapp compareobject

我能够对两个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)
}

1 个答案:

答案 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
  #
}