批处理脚本从多个文本文件的每一行计算整数(相加)

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+333echo !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.exeipconfig.exesetx.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

【讨论】:

还有这里..

以上是关于批处理脚本从多个文本文件的每一行计算整数(相加)的主要内容,如果未能解决你的问题,请参考以下文章

设置从文本文件的每一行解析的未知数量的变量

从包含 url 的文本文件中获取 url 的文件大小

bat脚本学习

如何使用 Windows 批处理文件遍历文本文件中的每一行?

shell 脚本里面从一个文本里面读出一个数字,如何转换成整数?我需要用这个数字进行加减乘除

用python读取文本文件,对读出的每一行进行操作,这个怎么写?