我目前有一个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
当你处理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
对象计算。当然,您应该根据您的特殊需求进行调整。 ;-)