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

如何使用PowerShell计算特定行子串数值和并写入指定位置

PowerShell处理文件:提取D行数字求和并写入S行对应位置

这里有一个直接可用的PowerShell脚本,完美匹配你的需求,我会一步步拆解每个部分的作用:

完整脚本

# 定义输入文件路径,根据你的实际文件修改
$inputFile = "your_input_file.txt"
$tempFile = "temp_processed.txt"

# 读取文件所有行到内存
$allLines = Get-Content -Path $inputFile

# 第一步:计算所有D开头行的目标数字之和
$totalSum = 0.0
foreach ($line in $allLines) {
    if ($line.StartsWith("D")) {
        # 提取第3到13位字符(注意:PowerShell字符串索引从0开始,第3位对应索引2,共11个字符)
        $numStr = $line.Substring(2, 11).Trim()
        # 尝试转换为数字,避免非数字内容报错
        if ([decimal]::TryParse($numStr, [ref]$currentNum)) {
            $totalSum += $currentNum
        }
    }
}

# 格式化求和结果,确保占5个字符(对应S行第10-14位的位置),保留两位小数
$formattedResult = $totalSum.ToString("F2").PadLeft(5)

# 第二步:修改所有S开头行的目标位置
$processedLines = foreach ($line in $allLines) {
    if ($line.StartsWith("S")) {
        # 拆分S行:前9位字符 + 格式化后的结果 + 第15位及以后的内容
        $prefix = $line.Substring(0, 9)
        $suffix = $line.Substring(14)
        $prefix + $formattedResult + $suffix
    } else {
        # 非S行直接保留原内容
        $line
    }
}

# 将结果写入临时文件,再替换原文件(避免处理中断损坏原文件)
$processedLines | Set-Content -Path $tempFile -Encoding UTF8
# 如果你确认没问题,可以取消下面两行注释来替换原文件
# Remove-Item -Path $inputFile
# Rename-Item -Path $tempFile -NewName $inputFile

Write-Host "处理完成!总和为: $totalSum"

关键步骤解释

  • 读取文件:用Get-Content把所有行加载到内存,方便逐行处理,效率比边读边写更高。
  • 提取D行数字:
    • 用StartsWith("D")筛选目标行;
    • Substring(2, 11)是核心:因为PowerShell字符串索引从0开始,你要的第3位对应索引2,第13位对应索引12,所以截取长度是11(13-3+1);
    • 用[decimal]::TryParse做安全转换,防止行里有非数字内容导致脚本崩溃,同时decimal类型比double更适合精确计算金额类数值。
  • 格式化结果:ToString("F2")确保保留两位小数,PadLeft(5)让结果固定占5个字符,这样替换后不会改变S行的总长度,避免破坏文件格式。
  • 修改S行:同样用Substring拆分字符串,把第10-14位(对应索引9-13)替换成格式化后的总和,其他部分保持不变。
  • 安全写入:先写入临时文件,确认没问题再替换原文件,避免处理过程中出错导致原文件损坏。

注意事项

  • 如果你的文件是ANSI编码,记得把Set-Content的-Encoding UTF8改成-Encoding Default,避免乱码。
  • 如果有多个S开头的行,脚本会修改所有符合条件的行;如果只想修改第一个S行,可以加个标志变量,比如:
    $modified = $false
    $processedLines = foreach ($line in $allLines) {
        if ($line.StartsWith("S") -and !$modified) {
            # 执行替换逻辑
            $prefix = $line.Substring(0, 9)
            $suffix = $line.Substring(14)
            $prefix + $formattedResult + $suffix
            $modified = $true
        } else {
            $line
        }
    }
    
  • 如果提取的数字位数或格式有变化,可以调整Substring的参数和格式化字符串,比如如果要保留三位小数,把"F2"改成"F3"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:25:42