如何使用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
相关产品推荐
相关产品推荐

