0

我能够区分两个 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 分钟。我想不时开始收集增量,NN+15 minutes在我们实施更改之前找出卷上数据(当然包括快照)的估计总体增长率。是snap delta的,Data ONTAP 方法是为现有快照生成此内容。

谢谢

[关于评论的更新]

档案一:

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不是求和。我很难找到如何做到这一点。

根据下面选择的答案解决

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

1 回答 1

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
  #
}
于 2017-04-17T14:06:46.333 回答