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

PowerShell脚本CSV转XML时DocNumber字段补前导零问题求助

解决PowerShell脚本中DocNumber字段补前导零无效的问题

你编写的PowerShell脚本负责将CSV文件每行转换为XML,但DocNumber字段无法正确补前导零至8位——即便尝试了PadLeft和格式化函数,XML输出仍显示原始文本。

问题根源

  1. Import-Csv默认将所有CSV字段解析为字符串类型,若补零逻辑未正确作用到字段输出环节,就会导致XML中仍显示原始值。
  2. 你的脚本里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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:36:31