You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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-05
  • 10142020:拆分为10/14/2020,转为2020-10-14
  • 10132022:拆分为10/13/2022,转为2022-10-13
  • NULL:直接设为NULL
  • 6/15/2020 6/16/2020:取第一个日期6/15/2020,转为2020-06-15
  • 7/:无有效年/日信息,设为NULL
  • 09012022:拆分为09/01/2022,转为2022-09-01
  • 02262021:拆分为02/26/2021,转为2021-02-26
  • 05042021:拆分为05/04/2021,转为2021-05-04
  • ES:无日期信息,设为NULL
  • 01252021:拆分为01/25/2021,转为2021-01-25
  • 01262021:拆分为01/26/2021,转为2021-01-26
  • 01202021:拆分为01/20/2021,转为2021-01-20
  • 03/202022:拆分为03/20/2022,转为2022-03-20
  • 10202022:拆分为10/20/2022,转为2022-10-20
  • Last week:转换为当前日期的上周日(可根据需求修改为周一等)
  • 10/06//2022:替换双斜杠为单斜杠,转为2022-10-06

内容的提问来源于stack exchange,提问作者Code Novice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:07:06