#powershell #optimization #psobject
#powershell #оптимизация #psobject
Вопрос:
Как и в случае с приведенным ниже кодом, для обработки скрипта потребуется около часа. Я пытаюсь найти способы сократить время, поскольку этот скрипт будет выполняться по расписанию каждый день.
Я заметил, что при создании нового объекта он будет использовать одинаковые $_.Tag.Substring
1440 раз для каждого тега, и существует более 200 тегов.
Кроме того, объект измерения используется 3 раза для обработки через один и тот же $_.Сгруппируйте, чтобы получить минимальное, среднее и максимальное значение.
Как мне настроить их таким образом, чтобы они не выполняли те же процессы снова?
$data = Get-ChildItem $destinationPathPPP_*.csv |
ForEach-Object { $_.FullName } |
Import-Csv -Header Tag, Value, Date, Time, Mode, Alarm
$data | ForEach-Object {
[pscustomobject]@{
"Column 1" = $_.Tag.Substring(8,2)
"Pump Unit" = $_.Tag.Substring(10,2)
"Column 3" = $_.Tag.Substring(12,2)
"Column 4" = $_.Tag.Substring(14,1)
"Value" = $_.Value
"Time" = $_.Time
}
} | Export-Csv -Path "$destinationPathSummary.csv" -NoTypeInformation
$data | Group-Object Tag | ForEach-Object {
[pscustomobject]@{
"Column 1" = $_.Name.Substring(8,2)
"Pump Unit" = $_.Name.Substring(10,2)
"Column 3" = $_.Name.Substring(12,2)
"Column 4" = $_.Name.Substring(14,1)
"Minimum" = ($_.Group | Measure-Object -Property Value -Minimum).Minimum
"Average" = ($_.Group | Measure-Object -Property Value -Average).Average
"Maximum" = ($_.Group | Measure-Object -Property Value -Maximum).Maximum
}
} | Export-Csv -Path "$destinationPathStatistics.csv" -NoTypeInformation
Ответ №1:
Попробуйте это. Я считаю, что для этого требуется PowerShell версии v3 или выше, чтобы свойства, созданные добавлением элемента, «прилипали» к элементам $data.
$data = $data | ForEach-Object {
Add-Member -InputObject $_ NoteProperty -Name "Column 1" -Value ($_.Tag.Substring(8,2))
Add-Member -InputObject $_ NoteProperty -Name "Pump Unit" -Value ($_.Tag.Substring(10,2))
Add-Member -InputObject $_ NoteProperty -Name "Column 3" -Value ($_.Tag.Substring(12,2))
Add-Member -InputObject $_ NoteProperty -Name "Column 4" -Value ($_.Tag.Substring(14,1))
$_
}
$data | ForEach-Object {
[pscustomobject]@{
"Column 1" = $_."Column 1"
"Pump Unit" = $_."Pump Unit"
"Column 3" = $_."Column 3"
"Column 4" = $_."Column 4"
"Value" = $_.Value
"Time" = $_.Time
}
} | Export-Csv -Path "$destinationPathSummary.csv" -NoTypeInformation
Чтобы избежать дублирования объекта измерения, измените это:
$data | Group-Object Tag | ForEach-Object {
$measInfo = $_.Group | Measure-Object -Property Value -Minimum -Maximum -Average
[pscustomobject]@{
"Column 1" = $_.Group[0]."Column 1"
"Pump Unit" = $_.Group[0]."Pump Unit"
"Column 3" = $_.Group[0]."Column 3"
"Column 4" = $_.Group[0]."Column 4"
"Minimum" = $measInfo.Minimum
"Average" = $measInfo.Average
"Maximum" = $measInfo.Maximum
}
} | Export-Csv -Path "$destinationPathStatistics.csv" -NoTypeInformation
Комментарии:
1. Спасибо. Он сгенерировал summary.csv и statistics.csv немного быстрее. Однако $_.Tag.Substring будет получать одинаковые значения каждые 1440 раз (для каждого тега). Должен ли я попробовать создать другой объект со списком всех тегов и их подстрок в качестве ссылки? Улучшит ли это производительность?
2. Вы хотите сказать, что значение этих четырех свойств не изменяется для каждого элемента — по крайней мере, из того же файла CSV? Если это так, то да, создайте только один объект
$dataEx
и назначьте свойства один раз, а затем ссылайтесь на $dataEx (глобальный) в любое время, когда вам нужно ссылаться на значения свойств.
Ответ №2:
Я немного изменил его из кода Кита, чтобы все обрабатывалось из одного ForEach-Object
:
Get-ChildItem $destinationPathPPP_*.csv |
ForEach-Object { $_.FullName } |
Import-Csv -Header Tag, Value, Date, Time, Mode, Alarm |
Group-Object -Property Tag |
ForEach-Object {
$tag = $_.Name
$column1 = $tag.Substring(8,2)
$pumpUnit = $tag.Substring(10,2)
$column3 = $tag.Substring(12,2)
$column4 = $tag.Substring(14,1)
$_.Group | ForEach-Object {
[pscustomobject]@{
"Column 1" = $column1
"Pump Unit" = $pumpUnit
"Column 3" = $column3
"Column 4" = $column4
"Value" = $_.Value
"Time" = $_.Time
}
} | Export-Csv -Path "$destinationPathSummary.csv" -Append -NoTypeInformation
$measInfo = $_.Group | Measure-Object -Property Value -Minimum -Average -Maximum
[pscustomobject]@{
"Column 1" = $column1
"Pump Unit" = $pumpUnit
"Column 3" = $column3
"Column 4" = $column4
"Minimum" = $measInfo.Minimum
"Average" = $measInfo.Average
"Maximum" = $measInfo.Maximum
} | Export-Csv -Path "$destinationPathStatistics.csv" -Append -NoTypeInformation
}