Как я могу выполнить арифметику, чтобы найти различия значений в двух 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
файл 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)
}
1 ответ
Импортированные значения 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
#
}