Kurt L.
Kurt L.

Reputation: 702

Removing lines with past dates from a text file

I have a text file called HelplineSpecialRoster.txt that looks like this

01/01/2019,6AM,0400012345,Kurt,[email protected]
02/01/2019,6AM,0412345676,Bill,[email protected]
03/01/2019,6AM,0400012345,Sam,[email protected]
04/01/2019,6AM,0412345676,Barry,[email protected]
05/01/2019,6AM,0400012345,Kurt,[email protected]

I'm in Australia so the dates are day/month/year.

I have some code that creates a listbox that displays the lines from the text file, but I want to edit the text file before it is displayed to only show older dates. A helpful person gave me this code and it worked once but now it stopped working for some reason. When I delete the whole text file and recreated it it started working again but only once.

If there is a future shift in the file say

05/02/2019,6AM,0400012345,Kurt,[email protected]

and todays date being 29/01/2019 it works to delete the older shifts. If there is only old shifts in the file as above, it doesn't delete them. When I add a date that is in the future, then it works to delete the older ones and only keep the future one.

$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;

Any ideas?

Upvotes: 0

Views: 285

Answers (2)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200273

When there are only older dates in your input file the result in $CurrentAndFutureShifts will be empty. Empty values in a pipeline are skipped over, meaning that nothing is written to the output file, so the output file remains unchanged.

You can avoid this issue by passing the variable to the parameter -Value. Change

$CurrentAndFutureShifts | Set-Content $SpecialRosterPath

into

Set-Content -Value $CurrentAndFutureShifts -Path $SpecialRosterPath

Upvotes: 1

supermerio
supermerio

Reputation: 240

Rather than using a text file, use a CSV file with headers. This is essentially just a text file saved with a .csv file extension that includes headers for each column:

Note I have added an additional row at the bottom with a date older than today's to prove testing.

HelpineSpecialRoster.csv content:

Date,Time,Number,Name,Email
01/01/2019,6AM,400012345,Kurt,[email protected]
02/01/2019,6AM,412345676,Bill,[email protected]
03/01/2019,6AM,400012345,Sam,[email protected]
04/01/2019,6AM,412345676,Barry,[email protected]
05/01/2019,6AM,400012345,Kurt,[email protected]
01/02/2019,6AM,400012345,Dan,[email protected]

Set the path of the CSV:

$csvPath = "C:\HelpineSpecialRoster.csv"

Import CSV from file:

$csvData = Import-CSV $csvPath

Get todays date @ 00:00

$date = (Get-Date).Date

Filter csv data to show rows where the date is older than today's date:

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

Export the CSV data back over the original CSV:

$csvData | Export-CSV $csvPath -Force

Upvotes: 0

Related Questions