PowerShell CSV转换因系统DateTime格式不匹配报错及格式固定需求
解决方案
根因说明
- 之前的错误是将日期格式字符串错写为CSV的属性名,导致读取到null值触发空参数报错
- 选择了错误的区域信息(es-ES为西班牙区域,无法解析美国格式的AM/PM标识与月/日/年排列顺序)
- 未明确指定输入日期的匹配格式,解析逻辑依赖系统默认格式
完整修改后代码段
… $data = $csvData | ? {$_ -match "\(DTRE"} $dtreFileData = New-Object System.Collections.Generic.List[PSCustomObject] # 定义美国区域信息,匹配源数据的日期格式规则 $usCulture = [System.Globalization.CultureInfo]::GetCultureInfo("en-US") # 定义源数据的输入日期格式 $inputFormat = "MM/dd/yy, h:mm tt" # 定义需要的输出日期格式 $outputFormat = "dd-MMM-yyyy hh:mm tt" foreach ($item in $data) { $null = $item.Strategy -match "\(DTRE\|(.*)\)" $v = $Matches[1] -split '\|' $resultvalue = $v[0] | Convert-CurrencyStringToDecimal $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal $dtreData = [PSCustomObject]@{ # 按固定规则解析源日期,完全不受系统区域影响 'DateTime' = [datetime]::ParseExact($item.'Date/Time', $inputFormat, $usCulture).ToString($outputFormat) 'ResultValue' = [decimal]$resultvalue 'ExpectedValue' = [decimal]$expectedvalue } $null = $dtreFileData.Add($dtreData) $null = $dtreAllData.Add($dtreData) } $dtreFileData | Export-Csv -Path (Join-Path (Split-Path -Path $f -Parent) ($outFile + '.csv')) -Force -NoTypeInformation -Encoding ASCII …
关键修改说明
- 明确指定
en-US区域解析源数据,完全匹配美国日期的AM/PM标识、月/日/年排列规则 ParseExact参数顺序正确:第一个参数为读取到的原始日期字符串$item.'Date/Time',第二个为输入格式串,第三个为区域信息,避免空值报错- 解析完成后直接格式化为需要的
dd-MMM-yyyy hh:mm tt格式再存入对象,导出CSV时不会受系统日期格式影响,输出结果固定
内容的提问来源于stack exchange,提问作者adiario
相关产品推荐
相关产品推荐

