Sumar números de un .txt en Batch

Iniciado por rafaeljoseyepez, 5 Junio 2020, 20:06 PM

0 Miembros y 1 Visitante están viendo este tema.

rafaeljoseyepez

Buenas tardes, reciban un cordial saludo.

Tengo una duda, tengo un batch que me da como salida un archivo llamado total.txt y cada línea tiene un número, me gustaría sumar el total de ese archivo y me lo imprimiera en pantalla, es decir si el archivo tiene

5.5
2.5
3
4

que imprima TOTAL: 15

EdePC

Saludos,

- CMD no soporta aritmética con decimales, podrías utilizar métodos complejos extrayendo los decimales para tratarlos por separado ..., o mejor llamar a otra aplicación nativa para que haga el trabajo ya sea parcial o completamente, en este caso PowerShell que ya viene desde Windows 7 o WScript que ya viene desde Windows 98, recomendaría PowerShell ya que es mucho más sencillo y directo:

CitarC:\Users\EdSon\Desktop>PowerShell "ForEach ($n in Get-Content .\numeros.txt) { [Double]$total += $n }; Write-Host Total: $total"
Total: 15

C:\Users\EdSon\Desktop>

-- Suponiendo que exista el archivo numeros.txt en la carpeta actual

rafaeljoseyepez

#2
Encontré la forma, así:

Código (bash) [Seleccionar]
for %%F in (
 total.txt

) do (
 set /a DOLARES=0
 for /f "usebackq  delims=," %%a in ("%%F")  do set /a DOLARES+=%%a

)


pero como dices, me da problema con los decimales...

Encontré la forma con este código de que haga operaciones y me acepte decimales:

Código (bash) [Seleccionar]
:_calc
setlocal enabledelayedexpansion
if "%~1" EQU "add" set "sym=+"
if "%~1" EQU "sub" set "sym=-"
set "add_str=%~2"
set "add_str=!add_str:%sym%= !"
set/a hst=0,cnt=0,add=0
for %%_ in (%add_str%) do (
  set/a dec[!cnt!]=0
  for /f "tokens=2 delims=." %%. in ("%%_") do (
     call :_strlen "%%."
     set/a dec[!cnt!]=!errorlevel!
     if !errorlevel! GTR !hst! set/a hst=!errorlevel!
  )
  set/a cnt+=1
)
set/a cnt=0
if "%sym%" EQU "-" for %%_ in (%add_str:.=%) do (
  set/a pow=%hst%-%dec[0]%,n_b=%%_
  for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
  set/a add+=!n_b!*2
  goto :__op
)
:__op
for %%_ in (%add_str:.=%) do (
  call set/a pow=%hst%-%%dec[!cnt!]%%,n_b=%%_
  for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
  set/a add%sym%=!n_b!,cnt+=1
)
set "res=!add:~0,-%hst%!.!add:~-%hst%!"
if %hst% EQU 0 set "res=%res:~1%"
endlocal & set "%~3=%res%" & exit /b
:_strlen
  setlocal
  set/a cnt=0
  for /f "tokens=* eol=" %%_ in (
     '"cmd /u /c echo:%~1|more"'
  ) do set/a cnt+=1
  endlocal & exit /b %cnt%


y dentro del batch para invocar el código para hacer cualquier operación se llamaría de la siguiente manera:

Código (bash) [Seleccionar]
call:_calc add 2.3658+8.4102+14.61 var
echo:%var%


Lo que no sé es como incorporar eso el resultado del conteo de líneas...



Pero no sé como hacer el llamado para que me funcione con la sumatoria de las líneas...

Intenté esto, pero NO funciona, no logro comprender la lógica del código...
Código (bash) [Seleccionar]
) do (
 set /a DOLARES=0
 for /f "usebackq  delims=," %%a in ("%%F") do call:_calc add DOLARES+=%%a

)



rafaeljoseyepez

Cita de: EdePC en  5 Junio 2020, 23:03 PM
Saludos,

- CMD no soporta aritmética con decimales, podrías utilizar métodos complejos extrayendo los decimales para tratarlos por separado ..., o mejor llamar a otra aplicación nativa para que haga el trabajo ya sea parcial o completamente, en este caso PowerShell que ya viene desde Windows 7 o WScript que ya viene desde Windows 98, recomendaría PowerShell ya que es mucho más sencillo y directo:

-- Suponiendo que exista el archivo numeros.txt en la carpeta actual

Terminé solucionando tomando tu idea, seguí haciendo todo en batch, pero con un truquito....

Dentro de mi batch creé el archivo ps1 así:

Código (bash) [Seleccionar]
Echo . |set /p="ForEach ($n in Get-Content .\total.txt) { [Double]$total += $n }; Write-Host $total">>total.ps1 2>&1

dentro del mismo batch ejecuto el comando powershell siguiente:

Código (bash) [Seleccionar]
Powershell.exe -executionpolicy remotesigned -File  total.ps1>>f.txt 2>&1
Ese comando me genera un archivo de texto f.txt que contiene el total

Luego leo el archivo f.txt y el contenido le asigno la variable DOLARES
Código (bash) [Seleccionar]
(
set /p DOLARES=
)<f.txt


Luego elimino los dos archivos f.txt y total.ps1

Código (bash) [Seleccionar]
del "f.txt" /s /f /q
del "total.ps1" /s /f /q


y %DOLARES% imprime la cantidad con decimales, y todo dentro de batch, quien lo ejecuta ni cuenta se da que pasa por powershell :D

Gracias por darme esa idea amigo!