【发布时间】:2020-02-13 14:20:33
【问题描述】:
我有一个电话 .csv,其中包含 2020 年 1 月和 2 月的某些日子的编译数据,每一行都有每个状态花费的日期和时间,因为有人在一天内使用不同的状态,文件每个状态都有一行,我的脚本应该遍历文件,找到最短日期,然后开始在新文件上保存同一天的所有数据,所以我将以 01-01-2020、02-01-2020 和 02-01-2020 的一个文件结束以此类推,但它运行了 15 个小时,仍然是 1/22。
我用于日期的列称为“DateFull”,这是脚本
write-host "opening file"
$AT= import-csv “C:\Users\xxxxxx\Desktop\SignOnOff_20200101_20200204.csv”
write-host "parsing and sorting file"
$go= $AT| ForEach-Object {
$_.DateFull= (Get-Date $_.DateFull).ToString("M/d/yyyy")
$_
}
Write-Host "prep day"
$min = $AT | Measure-Object -Property Datefull -Minimum
Write-Host $min
$dateString = [datetime] $min.Minimum
Write-host $datestring
write-host "Setup dates"
$start = $DateString - $today
$start = $start.Days
For ($i=$start; $i -lt 0; $i++) {
$date = get-date
$loaddate = $date.AddDays($i)
$DateStr = $loadDate.ToString("M/d/yyyy")
$now = Get-Date -Format HH:mm:ss
write-host $datestr " " $now
#Install-Module ImportExcel #optional import if you dont have the module already
$Check = $at | where {$_.'DateFull' -eq $datestr}
write-host $check.count
if ($check.count -eq 0 ){}
else {$AT | where {$_.'DateFull' -eq $datestr} | Export-Csv "C:\Users\xxxxx\Desktop\signonoff\SignOnOff_$(get-date (get-date).addDays($i) -f yyyyMMdd).csv" -NoTypeInformation}
}
$at = ''
【问题讨论】:
-
CSV 有多大? @Jawad 除非源数据很大,否则代码可能有无限循环或意外的 O.
-
这是一个 50 MB 的文件
-
您能否从 CSV 中添加几行示例数据以获得所需的结果?
-
我看到您在几个地方使用了
Get-Date,只是为了在for loop中获取今天的日期。您可以将Get-Date的值分配给循环外的变量,然后调用该变量来代替cmdlet。 -
另外,
[datetime]"11/11/2019"比Get-date "11/11/2019"更有效。else loop内部的 IO 操作也可能会减慢你的速度。如果你能重构这个逻辑,那就更好了。
标签: powershell csv