PowerShell脚本CSV转XML时DocNumber字段补前导零问题求助
解决PowerShell脚本中DocNumber字段补前导零无效的问题
你编写的PowerShell脚本负责将CSV文件每行转换为XML,但DocNumber字段无法正确补前导零至8位——即便尝试了PadLeft和格式化函数,XML输出仍显示原始文本。
问题根源
Import-Csv默认将所有CSV字段解析为字符串类型,若补零逻辑未正确作用到字段输出环节,就会导致XML中仍显示原始值。- 你的脚本里
entryTemplate中的<fld43>$($FileName.DocNumber)</fld43>直接引用原始字段,未对其应用补零处理,这是核心问题所在。
解决方案
方案一:导入CSV时提前处理字段
在Import-Csv之后、分组之前,添加字段处理逻辑,确保后续模板使用的是已补零的值:
Import-Csv -Path $FilePath -Delimiter '|' | Where-Object{$_.IMIReBISID -eq "?"} | # 对DocNumber补前导零 ForEach-Object { # 先转为整数再格式化,自动补零到8位(若字段为纯数字) $_.DocNumber = "{0:D8}" -f [int]$_.DocNumber $_ } | Group-Object FileName -ov grp | ForEach-Object { # 后续逻辑保持不变 $invoice = foreach ($FileName in $_.Group) { $ExecutionContext.InvokeCommand.ExpandString($entryTemplate) } Write-host $XMLDirectory $FileName.FileName'.xml generated' $ExecutionContext.InvokeCommand.ExpandString($docTemplate) } | Set-Content -LiteralPath { $XMLDirectory + $FileName.FileName + '.xml' }
说明:若DocNumber可能包含非数字字符,可先添加验证逻辑:
if ($_.DocNumber -match '^\d+$'),仅对纯数字字段进行格式化。
方案二:直接在XML模板中处理字段
修改entryTemplate中的<fld43>行,在模板内直接应用补零逻辑:
# 替换entryTemplate中的对应行 <fld43>$("{0:D8}" -f [int]$FileName.DocNumber)</fld43>
或使用PadLeft方法(适合确保字符串长度为8位):
<fld43>$($FileName.DocNumber.PadLeft(8, '0'))</fld43>
额外注意事项
- 若CSV中的DocNumber字段包含前导空格,需先执行
$_.DocNumber = $_.DocNumber.Trim()清理后再处理。 - 测试时可在循环中添加
Write-Host "处理后DocNumber: $($FileName.DocNumber)",验证补零是否生效。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

