Как я могу выполнить арифметические действия, чтобы найти различия значений в двух CSV?

Я могу различать содержимое («ячейки») двух CSV и получать вывод с наивысшим значением, используя следующую функцию:

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

Однако я хочу получить дельту/разницу между значениями в ячейках.

Можно ли выполнить арифметические действия, чтобы найти различия значений в двух CSV?

Чтобы обеспечить контекст, мы увеличиваем расписание моментальных снимков томов NetApp, например, с шести часов до 15 минут. Я хотел бы начать собирать дельту от момента времени N до момента времени N+15 minutes, чтобы узнать предполагаемую общую скорость роста данных в томе (включая моментальные снимки, конечно), прежде чем мы внедрим изменение. Да, snap delta — это метод Data ONTAP для создания этого для существующих моментальных снимков.

Спасибо

[обновление в отношении комментария]

файл А:

VolumeName,TotalSize,AvailableSize,UsedSize
netapp_vol1,375809648400,101430421264,274379237136

файл Б:

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

person mbrownnyc    schedule 17.04.2017    source источник
comment
Можете ли вы показать нам два образца данных? т.е. два образца CSV, которые вы хотели бы сравнить и рассчитать разницу?   -  person Mathias R. Jessen    schedule 17.04.2017
comment
Спасибо за ответ, Матиас. Я обновил вопрос с примером с одной строкой.   -  person mbrownnyc    schedule 17.04.2017


Ответы (1)


Импортированные значения CSV представляют собой строки, поэтому вам, вероятно, потребуется преобразовать значения в соответствующий тип, например. с вычисляемым свойством:

$csv = Import-Csv 'C:\path\to\input.csv' |
       Select-Object VolumeName, @{n='UsedSize';e={[long]$_.UsedSize}}

Вышеупомянутое свойство (строка) 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
  #
}
person Ansgar Wiechers    schedule 17.04.2017
comment
Блин, опередил меня :-) - person Mathias R. Jessen; 17.04.2017
comment
Небольшие изменения, и все работает отлично! Я добавил вопрос выше с изменениями. - person mbrownnyc; 17.04.2017