Первый l oop не имеет особого смысла. Он просматривает содержимое CSV и преобразует дату каждой строки в различные форматы. После этого $go
никогда не используется.
$go= $AT| ForEach-Object {
$_.DateFull= (Get-Date $_.DateFull).ToString("M/d/yyyy")
$_
}
Позже делается попытка вычислить значение из неинициализированной переменной. $today
никогда не определяется.
$start = $DateString - $today
Похоже, однако, что вы хотите вычислить, в днях, сколько лет старшей записи.
Тогда есть все oop это считается от отрицательных дней до нуля. Во время каждой итерации ищется весь CSV:
$Check = $at | where {$_.'DateFull' -eq $datestr}
Если 30 дней и 15 000 строк, то 30 * 15000 = 450 000 итераций. Это имеет сложность O (n ^ 2), что означает, что время выполнения будет go высоко в небе даже для относительно небольшого числа дней и строк.
Следующая часть состоит в том, что тот же массив обрабатывается снова:
else {$AT | where {$_.'DateFull' -eq $datestr
Ну, условия поиска точно такие же, но теперь результаты отправляются в файл. Это побочный эффект удвоения вашей работы. Тем не менее, O (2n ^ 2) => O (n ^ 2), поэтому, по крайней мере, время выполнения не увеличивается в кубических c или хуже.
Что касается того, как это исправить, есть несколько вещей. Если вы сортируете CSV на основе даты, он может быть обработан впоследствии всего за один прогон.
$at = $at | sort -Property datefull
Затем повторите каждую строку. Поскольку строки расположены в порядке возрастания, первый является самым старым. Для каждой строки проверьте, изменилась ли дата. Если нет, добавьте его в буфер. Если он есть, сохраните старый буфер и создайте новый.
Образец не преобразует имена файлов в формате yyyyMMdd, и предполагает, что есть только два столбца foo
и datefull
, например,
$sb = new-object text.stringbuilder
# What's the first date?
$current = $at[0]
# Loop through sorted data
for($i = 0; $i -lt $at.Count; ++$i) {
# Are we on next date?
if ($at[$i].DateFull -gt $current.datefull) {
# Save the buffer
$file = $("c:\temp\OnOff_{0}.csv" -f ($current.datefull -replace '/', '.') )
set-content $file $sb.tostring()
# Pick the current date
$current = $at[$i]
# Create new buffer and save data there
$sb = new-object text.stringbuilder
[void]$sb.AppendLine(("{0},{1}" -f $at[$i].foo, $at[$i].datefull))
} else {
[void]$sb.AppendLine(("{0},{1}" -f $at[$i].foo, $at[$i].datefull))
}
}
# Save the final buffer
$file = $("c:\temp\OnOff_{0}.csv" -f ($current.datefull -replace '/', '.') )
set-content $file $sb.tostring()