Импорт-CSV слишком медленно - PullRequest
       7

Импорт-CSV слишком медленно

0 голосов
/ 13 сентября 2018

В настоящее время у меня есть сценарий PowerShell, который будет импортировать файл CSV, а затем отфильтровать 1-й столбец, чтобы удалить всю строку, если строка превышает определенное время. Однако использование Import-Csv занимает очень много времени. Есть ли другой способ достичь того же результата без использования Import-Csv?

Вот скрипт на данный момент:

$files = Get-ChildItem "C:\Results\*.csv"

foreach ($file in $files) {
    $filename = [IO.Path]::GetFileNameWithoutExtension($file)
    $csv = Import-Csv $file

    $dateTime = $csv[0]."Date and Time"

    $startTime = $dateTime.Substring($dateTime.get_Length()-8)

    $endTime = $startTime
    [int]$hour, [int]$min, [int]$sec = $endTime.Split(':')

    $hour = $hour + 1
    $min = 44
    $sec = 59

    $csv | ForEach-Object {
        $lineTime = $_."Date and Time"
        $startTime = $lineTime.Substring($lineTime.get_Length()-8)
        $newHour, $newMin, $newSec = $startTime.Split(':')
        if (($newHour -lt $hour -and $newMin -gt $min) -or ($newHour -eq $hour -and $newMin -le $min)) {
            $_ | Export-Csv -Path "C:\PerfResults\NewFiles\$filename-NEW.csv" -Append 
        }
    }
}

EDIT:

По запросу Олафа ниже приведен пример данных в файле CSV:

Date and Time   Memory Overcommit (1 Minute Avg)    Memory Overcommit (5 Minute Avg)    Memory Overcommit (15 Minute Avg)   Cpu Load (1 Minute Avg) Cpu Load (5 Minute Avg) Load (15 Minute Avg)    Physical Cpu(0)\% Processor Time
07/24/2018 14:45:03 0   0   0   0.11    0.13    0.11    7.31
07/24/2018 14:45:06 0   0   0   0.11    0.13    0.12    1.41

1 Ответ

0 голосов
/ 13 сентября 2018

Когда вы имеете дело с объектами DateTime, вы должны использовать их как таковые. Вы можете вычислить или даже сравнить их гораздо проще, чем в виде строк. Я думаю, это сделает вашу жизнь намного проще. Это будет быстрее, когда вы сначала соберете все необходимые данные, а затем сохраните их в файл за один раз.

$fileList = Get-ChildItem "C:\Results\*.csv"

foreach($file in $fileList) {
    $csv = Import-CSV -Path $file.FullName -Delimiter "`t"
    $NewData = foreach($Data in $csv){
        $Data |
            Select-Object -Property *,
                                    @{
                                        Name = 'NewDateAndTime';
                                        Expression = {
                                            $DateTime = [DateTime]::ParseExact($($Data.'Date and Time'),"MM/dd/yyyy HH:mm:ss",$null)
                                            $DateTime.AddHours(-4)
                                        }
                                    }
    }
    $NewData | Export-Csv -Path "C:\PerfResults\NewFiles\$($file.BaseName)-NEW.csv" -Delimiter "`t" -NoTypeInformation -Force
}

Если вам не нужны все данные из входного csv в выходном csv, вы можете выбрать те, которые вам нужны, с помощью Select-Object.

Редактировать: дополнительное объяснение - я преобразовал "строковые" дату и время из CSV-файла в DateTime объект с вычисляемым свойством. Затем я вычел 4 часа, чтобы показать, как рассчитать с DateTime объектами. Конечно, вы должны адаптировать его к вашим особым потребностям. ;-)

...