替换 csv 中格式错误的时间数据

Replace badly formatted time data in a csv

我正在尝试重新格式化包含赛马数据的 CSV 文件中的一些数据。我遇到的问题是比赛的时间戳不遵循任何常规惯例,因为它不识别 AM/PM(因为英国的所有比赛都在上午 11 点到晚上 10 点之间进行)

如果 11.55 始终是上午,并且 1.15 之一始终是下午 (13:15),那么时间戳

我正在尝试将它们全部更新为 24 小时格式,以便将数据从一个软件包移动到另一个软件包

所以我可以在 CSV 中阅读,做一些其他的替换没有问题,但我无法理解时间元素。我曾尝试过哈希表,但我很难用它来替换任何数据。

这是一些代码

$a = (get-Date).ToString("dd/MM/yyyy")

$timelist= @{
'1:00'='13:00'
'1:05'='13:05'
'1:10'='13:10'
'1:15'='13:15'
'1:20'='13:20'
'1:25'='13:25'
'1:30'='13:30'  etc all the way to 10:55

foreach ($file in $infiles){ 
$folder = Split-Path $file -Parent
$name = [System.IO.Path]::GetFileNameWithoutExtension($file)
$outfile = $folder+"\"+"$name"+".csv"

$csv = import-csv $file -delimiter "`t" | Select @{ name='Date' ;Expression={$a}},RaceTime,Track,Horse

    foreach ($row in $csv){
        $row.Horse = $row.Horse.Substring(0, $row.Horse.IndexOf(' ('))
        $row.Track = $row.Track.Substring(0, $row.Track.IndexOf(' ('))
        $row.RaceTime.Value = $timelist[$row.RaceTime]
                    }

            $csv | ConvertTo-Csv -NoType | 
                Select-Object -Skip 1 | 
                Set-Content $outfile 

输出文件根本不会更改时间戳。

编辑:包括输入样本数据

RaceTime    Track   RaceType    RaceClass   Horse   Odds    Jockey  Trainer Placing 
"2.15"  "Cartmel"   "Novices Hurdle"    "Class 4"   "Grapevine (IRE)"   "2.25"  "Brace, Connor" "Leech, Mrs S"  "4th"
"2.50"  "Cartmel"   "Handicap Hurdle"   "Class 4"   "Bannixtown Glory (IRE)"    "3.00"  "Hughes, Brian" "McCain Jnr, D" "3rd"
"3.25"  "Cartmel"   "Novices Chase" "Class 4"   "Francky Du Berlais (FR)"   "2.75"  "Bowen, Mr J C" "Bowen, P"  "3rd"
"4.00"  "Cartmel"   "Handicap Chase"    "Class 5"   "Mash Potato (IRE)" "3.25"  "Bowen, Mr S P" "Kelly, Noel C" "1st"
"4.35"  "Cartmel"   "Handicap Chase"    "Class 4"   "Day Of Roses (IRE)"    "3.50"  "Hughes, Brian" "Foster, Miss J E"  "3rd"
"5.10"  "Cartmel"   "Handicap Hurdle"   "Class 3"   "Cardigan Bay (FR)" "9.00"  "Coleman, A"    "Longsdon, C E" "7th"
"5.45"  "Cartmel"   "Handicap Hurdle"   "Class 4"   "Cape Hideaway" "2.50"  "Galligan, Mr M"    "Vaughan, Tim"  "2nd"
"2.00"  "Chelmsford City"   "Handicap Nursery"  "Class 6"   "Luna Wish" "2.75"  "Quinn, Jimmy"  "Margarson, G G"    "1st"
"2.35"  "Chelmsford City"   "Handicap Nursery"  "Class 4"   "Dandizette (IRE)"  "3.75"  "Coughlan, Laura"   "Nicholls, Adrian"  "5th"
"3.10"  "Chelmsford City"   "Handicap"  "Class 3"   "Emenem"    "5.00"  "Williams, Levi"    "Dow, S"    "3rd"
"3.45"  "Chelmsford City"   "Novices"   "Class 4"   "Strelka"   "3.25"  "Steward, Louis"    "Beckett, R M"  "2nd"
"4.20"  "Chelmsford City"   "Handicap"  "Class 5"   "Bayston Hill"  "7.00"  "Marsh, Finley" "Usher, M D I"  "2nd"
"4.20"  "Chelmsford City"   "Handicap"  "Class 5"   "Dangerous Ends"    "6.00"  "Carver, William"   "Johnson, B R"  "9th"
"4.50"  "Chelmsford City"   "Handicap"  "Class 4"   "Attainment"    "3.00"  "Haynes, Joey"  "Tate, James"   "1st"
"5.25"  "Chelmsford City"   "Handicap"  "Class 6"   "Magicinthemaking (USA)"    "5.00"  "ONeill, K T"   "Long, J E" "2nd"

我会放弃转换 table,转而使用一点日期算法:

$today = Get-Date -Format "dd/MM/yyyy"

foreach ($file in $infiles) { 
    $folder = Split-Path $file -Parent
    $name = [System.IO.Path]::GetFileNameWithoutExtension($file)
    $outfile = Join-Path $folder "$name.csv"

    $csv = Import-Csv $file -delimiter "`t" | Select-Object @{n='Date';e={$today}},RaceTime,Track,Horse

    foreach ($row in $csv) {
        $row.Horse = ($row.Horse -split ' \(')[0]
        $row.Track = ($row.Track -split ' \(')[0]
        $RaceTime = Get-Date ($row.RaceTime -replace '\.',':')  # Get-Date expects a colon
        if ($RaceTime.Hour -lt 11) { $RaceTime = $RaceTime.AddHours(12) }
        $row.RaceTime = Get-Date $RaceTime -Format "HH:mm"
    }

    $csv | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content $outfile 
}

您还可以考虑删除结果 CSV 中单独的 Date 列,并立即将 RaceTime 格式化为完整日期。