批处理脚本从多个文本文件的每一行计算整数(相加)
Posted
技术标签:
【中文标题】批处理脚本从多个文本文件的每一行计算整数(相加)【英文标题】:Batch script calculate integer (add) from each row from multiple text files 【发布时间】:2022-01-19 17:57:21 【问题描述】:我有多个文本文件,每行都包含整数。 loop for /f 可以从每个文件的每一行依次计算(加)吗?
假设文本文件是这样的:
File1.txt
123
213
321
File2.txt
111
222
333
File3.txt
333
222
111
是否可以遍历多个文件内容并总结类似的行 IE:
file1 row1 + file2 row1 + file3 row1 file1 row2 + file2 row2 + file3 row2 file1 row3 + file2 row3 + file3 row3:: 每个文件第一行的操作应该是:Set /A calc=123+111+333
echo !calc!
谷歌搜索后,我找不到任何与我的问题类似的解决方案。
如果有人可以提供有关此方面的见解,请不胜感激。
谢谢
【问题讨论】:
我们不知道如何“提供对此的见解”,因为您告诉我们的只是您无法通过“谷歌搜索”找到未知编码问题的解决方案。此站点不是为了代表您执行网络搜索,也不是为了根据缺少发布的信息来猜测问题。我们对您的期望是您的失败代码的minimal reproducible example,其中包含错误和相关的调试信息,以及指南中的一个可回答的问题。我们不提供免费的代码编写服务,我们只在复制报告的问题时帮助您修复自己的代码。 要深入了解本网站的运作方式,请拨打tour,访问help center,并在此处了解How to Ask!对于研究,将任务分成更小的子项目并查找它们,因为您可能无法在网络上找到完整的解决方案。一旦你自己尝试了一些东西但失败了,回到这里,edit 你的问题,并提供你的编码尝试的minimal reproducible example... 除了 MRE(Minimal, Reproducible Example),请展示正确的输出。 【参考方案1】:对于我的删除单个总和文件的方法:-
求和.bat
@echo off & SETLOCAL ENABLEDELAYEDEXPANSION & Title Summation
for /f "tokens=1* delims=[]" %%A in ('find /n /v "%Title%" "%~1"') do (set "L%%A=%%B" & set "count=%%A")
set calc=0 & for /L %%i in (1,1,!count!) do (set /a calc = !calc! + !L%%i!)
echo/ & echo Line Count = !count! ^& Sum = !calc! & echo/ & pause
命令行用法>Summation File1.txt
请注意下面@T3RROR 的评论
我将您的问题误读为“一次提供一个文件的总和”。
但已将其保留在这里以供其他希望汇总每个文件的人使用。
良好的批处理,cmd 可能与您同在 :-)
【讨论】:
【参考方案2】:您可以在单个 for
循环中使用 findstr
并按文件顺序设置结果:
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1*delims=:" %%i in ('findstr /R "[0-9]" file*.txt') do (
set /a %%~ni+=1 & set /a _Result[!%%~ni!]+=%%j
)
set _Result
每个文件的每一行都将被加在一起,结果(基于您当前的示例:
【讨论】:
【参考方案3】:cmd
运行的这个 batch-file
使用 PowerShell 脚本。它为每一行创建一个哈希项,并为每一行累加总和。
@powershell.exe -NoLogo -NoProfile -Command ^
"$h = @;" ^
"Get-ChildItem -Filter 'filefile*.txt' |" ^
"ForEach-Object " ^
"$LineNumber = 0;" ^
"Get-Content -Path $_.FullName |" ^
"ForEach-Object $h[$LineNumber++] += [int]$_ " ^
";" ^
"0..($h.Count-1) | ForEach-Object $h[$_] "
如果写在 .ps1 文件中,这会更容易和更清晰。
$h = @
Get-ChildItem -Filter 'filefile*.txt' |
ForEach-Object
$LineNumber = 0
Get-Content -Path $_.FullName |
ForEach-Object $h[$LineNumber++] += [int]$_
0..($h.Count-1) | ForEach-Object $h[$_]
您可能会看到有人认为 PowerShell 不属于cmd
的一部分而对此表示反对。 PowerShell 与find.exe
、ipconfig.exe
和setx.exe
一样,都是cmd
的一部分。 PowerShell 可在所有受支持的 Windows 系统上使用。
【讨论】:
【参考方案4】:您可以这样使用array:
@echo off
setlocal EnableDelayedExpansion
for %%f in (file*.txt) do (
set "i=1"
for /F %%n in (%%f) do set /A "calc[!i!]+=%%n, i+=1"
)
set /A i-=1
for /L %%i in (1,1,%i%) do echo calc[%%i] = !calc[%%i]!
【讨论】:
【参考方案5】:您可以在 findstr 的输出上使用单个 for 循环来根据每行值构建计数。
@Echo off & CD /D "%~dp0"
cls
Setlocal
For /f "tokens=1 Delims==" %%g in ('set Line[ 2^> nul')Do Set "%%g=" 2> nul
For /f "tokens=2,3 delims=:" %%i in ('%Systemroot%\System32\Findstr.exe /n /r "^[0123456789]*$" "file*.txt"')Do (
Set /A "Line[%%i]+=%%j+0" 2> nul
)
Set Line[
Endlocal
【讨论】:
还有这里..以上是关于批处理脚本从多个文本文件的每一行计算整数(相加)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Windows 批处理文件遍历文本文件中的每一行?