如何在PowerShell中为初始校验失败的类日期添加二次校验转有效日期
问题需求
我有多份各含约74k条记录的文件,部分Text/Varchar列混合了有效日期与无效日期,导致数据导入失败。多数无效日期可直观转换为有效日期,需在现有PowerShell代码的日期扫描循环中,对初始校验失败的「类日期」执行二次校验:若能转换则返回有效日期,否则设为NULL以避免导入失败。
修改后的PowerShell代码
# 声明文件路径 $SourceFile = "AlmostDates.tsv" $ExportFile = "AlmostDates_Updated.tsv" # 导入数据 $ProcessData = Import-Csv $SourceFile -Delimiter "`t" $countValidDates = 0 $countFixedDates = 0 $totalRecords = $ProcessData.Count Write-Host "总记录数: $totalRecords" # 定义日期转换辅助函数 function Convert-ToValidDate { param([string]$InputString) $tempStr = $InputString.Trim() # 处理字符串"NULL" if ($tempStr -eq "NULL") { return $null } # 替换下划线为斜杠,尝试转换 $tempStr = $tempStr -replace '_', '/' if ($date = $tempStr -as [datetime]) { return $date } # 处理8位纯数字(MMDDYYYY格式) if ($tempStr -match '^\d{8}$') { $formatted = "$($tempStr.Substring(0,2))/$($tempStr.Substring(2,2))/$($tempStr.Substring(4,4))" if ($date = $formatted -as [datetime]) { return $date } } # 处理双日期(取第一个有效日期) if ($tempStr -match '^\d{1,2}/\d{1,2}/\d{4}\s+\d{1,2}/\d{1,2}/\d{4}$') { $firstDate = $tempStr.Split(' ')[0] if ($date = $firstDate -as [datetime]) { return $date } } # 处理多斜杠(替换为单斜杠) $tempStr = $tempStr -replace '//', '/' if ($date = $tempStr -as [datetime]) { return $date } # 处理MM/YYYYYY格式(拆分后两位为日,后四位为年) if ($tempStr -match '^(\d{1,2})/(\d{6})$') { $formatted = "$($matches[1])/$($matches[2].Substring(0,2))/$($matches[2].Substring(2,4))" if ($date = $formatted -as [datetime]) { return $date } } # 处理"Last week",转换为上周日(可根据需求调整为周一等) if ($tempStr -eq "Last week") { $lastSunday = (Get-Date).AddDays(-(Get-Date).DayOfWeek.value__ - 0) return $lastSunday } # 其他无法转换的情况返回null return $null } $ProcessData | ForEach-Object { # 遍历所有字段,清理内容并处理日期 foreach ($property in $_.PSObject.Properties) { if ( ![string]::IsNullOrEmpty($property.Value) ) { # 清理字段内的引号、制表符、换行符并修剪空格 $property.Value = $property.Value -replace '\"','' -replace "`t",' ' -replace "`r",'' -replace "`n",'' $property.Value = $property.Value.Trim() # 首次日期校验 if ( $validDate = $property.Value -as [datetime] ) { $countValidDates++ $property.Value = $validDate.ToString('yyyy-MM-dd') } else { # 二次校验尝试转换 if ( $fixedDate = Convert-ToValidDate $property.Value ) { $countFixedDates++ $property.Value = $fixedDate.ToString('yyyy-MM-dd') } else { # 无法转换则设为NULL $property.Value = $null } } } } # 输出处理后的对象 $_ } | Export-Csv $ExportFile -Delimiter "`t" -UseQuotes Never -NoTypeInformation Write-Host "初始有效日期数量: $countValidDates" Write-Host "修复后新增有效日期数量: $countFixedDates" Write-Host "总有效日期数量: $($countValidDates + $countFixedDates)"
针对示例无效日期的处理说明
以下是对给出的17种无效日期的转换逻辑:
05_11_2022:替换下划线为斜杠,转为2022-11-0510142020:拆分为10/14/2020,转为2020-10-1410132022:拆分为10/13/2022,转为2022-10-13NULL:直接设为NULL6/15/2020 6/16/2020:取第一个日期6/15/2020,转为2020-06-157/:无有效年/日信息,设为NULL09012022:拆分为09/01/2022,转为2022-09-0102262021:拆分为02/26/2021,转为2021-02-2605042021:拆分为05/04/2021,转为2021-05-04ES:无日期信息,设为NULL01252021:拆分为01/25/2021,转为2021-01-2501262021:拆分为01/26/2021,转为2021-01-2601202021:拆分为01/20/2021,转为2021-01-2003/202022:拆分为03/20/2022,转为2022-03-2010202022:拆分为10/20/2022,转为2022-10-20Last week:转换为当前日期的上周日(可根据需求修改为周一等)10/06//2022:替换双斜杠为单斜杠,转为2022-10-06
内容的提问来源于stack exchange,提问作者Code Novice
相关产品推荐
相关产品推荐

