【发布时间】:2018-09-13 10:38:22
【问题描述】:
我目前有一个 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 文件中的数据示例:
日期和时间 内存过量使用(1 分钟平均值) 内存过量使用(5 分钟平均值) 内存过量使用(15 分钟平均值) Cpu 负载(1 分钟平均值) Cpu 负载(5 分钟平均值) 负载(15 分钟平均值) 物理 Cpu(0)\ % 处理器时间 2018 年 7 月 24 日 14:45:03 0 0 0 0.11 0.13 0.11 7.31 2018 年 7 月 24 日 14:45:06 0 0 0 0.11 0.13 0.12 1.41【问题讨论】:
-
您也可以发布几行 csv 文件(也请格式化为代码 ;-))。当您首先在自定义对象中“收集”结果并在最后将其全部导出时,它可能会加快您的代码速度。使用
-Append真的很慢,因为在后台进行必要的文件系统操作。 -
感谢您的回复 Olaf,我正在使用的 csv 文件有大约 12500 列和 1800 行,因此发布行可能有点困难。
-
因此,您应该将行缩短到相关列,并从中选择 3 或 4 行。当然,如果需要,您应该混淆敏感信息。
-
我附上了文件包含的日期示例,不知道如何更改格式,以便每个数据条目显示在列名下。
-
CSV 中的 12500 列太疯狂了。为什么要使用 CSV 而不是数据库来保存这些数据?
标签: powershell import-csv