Import-Csv太慢

时间:2018-09-13 10:38:22

标签: powershell import-csv

我目前有一个PowerShell脚本,该脚本将导入CSV文件,然后在行超过一定时间时过滤第一列以删除整行。但是,使用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 
        }
    }
}

编辑:

按照Olaf的要求,以下是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 :(得分:1)

当处理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对象进行计算。当然,您应该使其适应您的特殊需求。 ;-)