Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: rafaeljoseyepez en 5 Junio 2020, 20:06 pm



Título: Sumar números de un .txt en Batch
Publicado por: rafaeljoseyepez en 5 Junio 2020, 20:06 pm
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


Título: Re: Sumar números de un .txt en Batch
Publicado por: 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:

Citar
C:\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


Título: Re: Sumar números de un .txt en Batch
Publicado por: rafaeljoseyepez en 6 Junio 2020, 00:30 am
Encontré la forma, así:

Código
  1. for %%F in (
  2.  total.txt
  3.  
  4. ) do (
  5.  set /a DOLARES=0
  6.  for /f "usebackq  delims=," %%a in ("%%F")  do set /a DOLARES+=%%a
  7.  
  8. )
  9.  

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
  1. :_calc
  2. setlocal enabledelayedexpansion
  3. if "%~1" EQU "add" set "sym=+"
  4. if "%~1" EQU "sub" set "sym=-"
  5. set "add_str=%~2"
  6. set "add_str=!add_str:%sym%= !"
  7. set/a hst=0,cnt=0,add=0
  8. for %%_ in (%add_str%) do (
  9.   set/a dec[!cnt!]=0
  10.   for /f "tokens=2 delims=." %%. in ("%%_") do (
  11.      call :_strlen "%%."
  12.      set/a dec[!cnt!]=!errorlevel!
  13.      if !errorlevel! GTR !hst! set/a hst=!errorlevel!
  14.   )
  15.   set/a cnt+=1
  16. )
  17. set/a cnt=0
  18. if "%sym%" EQU "-" for %%_ in (%add_str:.=%) do (
  19.   set/a pow=%hst%-%dec[0]%,n_b=%%_
  20.   for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
  21.   set/a add+=!n_b!*2
  22.   goto :__op
  23. )
  24. :__op
  25. for %%_ in (%add_str:.=%) do (
  26.   call set/a pow=%hst%-%%dec[!cnt!]%%,n_b=%%_
  27.   for /l %%. in (1,1,!pow!) do set "n_b=!n_b!0"
  28.   set/a add%sym%=!n_b!,cnt+=1
  29. )
  30. set "res=!add:~0,-%hst%!.!add:~-%hst%!"
  31. if %hst% EQU 0 set "res=%res:~1%"
  32. endlocal & set "%~3=%res%" & exit /b
  33. :_strlen
  34.   setlocal
  35.   set/a cnt=0
  36.   for /f "tokens=* eol=" %%_ in (
  37.      '"cmd /u /c echo:%~1|more"'
  38.   ) do set/a cnt+=1
  39.   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
  1. call:_calc add 2.3658+8.4102+14.61 var
  2. 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
  1. ) do (
  2.  set /a DOLARES=0
  3.  for /f "usebackq  delims=," %%a in ("%%F") do call:_calc add DOLARES+=%%a
  4.  
  5. )



Título: Re: Sumar números de un .txt en Batch
Publicado por: rafaeljoseyepez en 8 Junio 2020, 06:26 am
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
  1. 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
  1. 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
  1. (
  2. set /p DOLARES=
  3. )<f.txt

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

Código
  1. del "f.txt" /s /f /q
  2. del "total.ps1" /s /f /q
  3.  

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!