Оптимизация создания псевдообъекта

#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

    }