Удаление строк с прошлыми датами из текстового файла - PullRequest
0 голосов
/ 28 января 2019

У меня есть текстовый файл HelplineSpecialRoster.txt, который выглядит следующим образом

01/01/2019,6AM,0400012345,Kurt,kurt@outlook.com
02/01/2019,6AM,0412345676,Bill,bill@outlook.com
03/01/2019,6AM,0400012345,Sam,Sam@outlook.com
04/01/2019,6AM,0412345676,Barry,barry@outlook.com
05/01/2019,6AM,0400012345,Kurt,kurt@outlook.com

Я в Австралии, поэтому даты - день / месяц / год.

У меня есть кодэто создает список, в котором отображаются строки из текстового файла, но я хочу отредактировать текстовый файл, прежде чем он будет отображаться, чтобы показывать только более старые даты.Полезный человек дал мне этот код, и он работал один раз, но теперь почему-то перестал работать.Когда я удаляю весь текстовый файл и воссоздаю его, он снова начинает работать, но только один раз.

Если в файле есть будущий сдвиг, скажем

05/02/2019,6AM,0400012345,Kurt,kurt@outlook.com

, а сегодняшняя дата 29/01/2019, он удаляет более старые сдвиги.Если в файле есть только старые сдвиги, как указано выше, они не удаляются.Когда я добавляю дату в будущем, она удаляет старые и сохраняет только будущую.

$SpecialRosterPath = "C:\Helpline Dialer\HelplineSpecialRoster.txt"
$CurrentDate2 = (Get-Date).Date  # to have a datetime starting today at 00:00:00

Function DeleteOlderShifts {
    $CurrentAndFutureShifts = Get-Content $SpecialRosterPath | Where-Object {
        $_ -match "^(?<day>\d{2})\/(?<mon>\d{2})\/(?<year>\d{4})" -and
        (Get-Date -Year $Matches.year -Month $Matches.mon -Day $Matches.day) -ge $CurrentDate2
    }
    $CurrentAndFutureShifts
    $CurrentAndFutureShifts | Set-Content $SpecialRosterPath
}

DeleteOlderShifts;

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если во входном файле есть только более старые даты, результат в $CurrentAndFutureShifts будет пустым.Пустые значения в конвейере пропускаются, это означает, что ничего не записывается в выходной файл, поэтому выходной файл остается неизменным.

Эту проблему можно избежать, передав переменную параметру -Value.Измените

$CurrentAndFutureShifts | Set-Content $SpecialRosterPath

на

Set-Content -Value $CurrentAndFutureShifts -Path $SpecialRosterPath
0 голосов
/ 28 января 2019

Вместо использования текстового файла используйте файл CSV с заголовками.По сути, это всего лишь текстовый файл, сохраненный с расширением .csv, который включает заголовки для каждого столбца:

Примечание. Я добавил дополнительную строку внизу с датой, более старой, чем сегодняшняя, чтобы подтвердить тестирование.

HelpineSpecialRoster.csv content:

Date,Time,Number,Name,Email
01/01/2019,6AM,400012345,Kurt,kurt@outlook.com
02/01/2019,6AM,412345676,Bill,bill@outlook.com
03/01/2019,6AM,400012345,Sam,Sam@outlook.com
04/01/2019,6AM,412345676,Barry,barry@outlook.com
05/01/2019,6AM,400012345,Kurt,kurt@outlook.com
01/02/2019,6AM,400012345,Dan,dan@outlook.com

Установите путь к CSV:

$csvPath = "C:\HelpineSpecialRoster.csv"

Импорт CSV из файла:

$csvData = Import-CSV $csvPath

Получить текущую дату@ 00: 00

$date = (Get-Date).Date

Фильтрация данных CSV для отображения строк, в которых дата старше сегодняшней даты:

$csvData = $csvData | ? { (Get-Date $date) -lt (Get-Date $_.Date) }

Экспорт данных CSV обратно поверх исходного CSV:

$csvData | Export-CSV $csvPath -Force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...