Суммируйте значения файла .txt с помощью команды .bat - PullRequest
0 голосов
/ 23 июня 2018

У меня есть этот скрипт ниже:

set "$file=futuroscielotan.txt"
set "$search=Previsto"

set $repl[2]=TOTAL       
set $repl[3]=Visa        
set $repl[4]=Mastercard  
set $repl[5]=Amex        
set $repl[6]=Sorocred    
set $repl[7]=Elo         
set $repl[8]=Diners      
set $repl[9]=Agiplan     
set $repl[10]=Banescard   
set $repl[11]=Cabal       
set $repl[12]=Credsystem  
set $repl[13]=Hipercard   
set $repl[14]=Credz       
set $repl[15]=Hiper       

setlocal enabledelayedexpansion
set $count=1

(for /f "delims=" %%a in (%$file%) do (
   call:replace "%%a" !$count!
   set/a $count+=1
   )
)> "Futuros Cielo Tan.txt"
echo. >> "Futuros Cielo Tan.txt"
echo ---  FUTUROS CIELO TAN --- >> "Futuros Cielo Tan.txt"

mkdir "C:\Users\lojas\Desktop\Extratos Banco" 
move "Futuros Cielo Tan.txt" "C:\Users\lojas\Desktop\Extratos Banco\Futuros Cielo Tan.txt"

exit/b

:replace
set "$line=%~1"
set $repl=!$repl[%2]!
set "$line=!$line:%$search%=%$repl%!"
echo !$line!
if "%2"=="1" echo.
if "%2"=="2" echo.

Выходной файл .txt этого скрипта выглядит так:

01/06/2018 à 20/03/2019

TOTAL       :  R$ 22.250,74  

Visa        :  R$ 1.086,51  
Mastercard  :  R$ 492,63  
Amex        :  R$ 0,00  
Sorocred    :  R$ 20.109,98  
Elo         :  R$ 0,00  
Diners      :  R$ 0,00  
Agiplan     :  R$ 0,00  
Banescard   :  R$ 0,00  
Cabal       :  R$ 0,00  
Credsystem  :  R$ 0,00  
Hipercard   :  R$ 0,00  
Credz       :  R$ 0,00  

---  FUTUROS CIELO TAN --- 

Но мне нужен способ суммировать значениякарты и создать еще одну строку под названием TOTAL VALUE OF CARDS CHECKED: xxxxxx

Это должно быть, как показано ниже:

01/06/2018 à 20/03/2019

TOTAL       :  R$ 22.250,74  

Visa        :  R$ 1.086,51  
Mastercard  :  R$ 492,63  
Amex        :  R$ 0,00  
Sorocred    :  R$ 20.109,98  
Elo         :  R$ 0,00  
Diners      :  R$ 0,00  
Agiplan     :  R$ 0,00  
Banescard   :  R$ 0,00  
Cabal       :  R$ 0,00  
Credsystem  :  R$ 0,00  
Hipercard   :  R$ 0,00  
Credz       :  R$ 0,00  

TOTAL CARD VALUES CHECKED: R$ 21.689,12

---  FUTUROS CIELO TAN --- 

Как я могу это сделать?


Просто попытался сделать ещеКоманда только для теста.Следуйте ниже:

for /f "tokens=1 delims=R$ " %%a in (Futuros Cielo Tan.txt) do set /a total+=%%a
echo TOTAL CHECKED:  %total% >test.txt

Но это не суммирование.Это всегда ставит 0, вот так: TOTAL CHECKED: 0

Ответы [ 2 ]

0 голосов
/ 24 июня 2018
@echo off
setlocal enabledelayedexpansion

set "$file=futuroscielotan.txt"
set "$search=Previsto"
set "output=Futuros Cielo Tan.txt"

set "$repl[2]=TOTAL       "
set "$repl[3]=Visa        "
set "$repl[4]=Mastercard  "
set "$repl[5]=Amex        "
set "$repl[6]=Sorocred    "
set "$repl[7]=Elo         "
set "$repl[8]=Diners      "
set "$repl[9]=Agiplan     "
set "$repl[10]=Banescard   "
set "$repl[11]=Cabal       "
set "$repl[12]=Credsystem  "
set "$repl[13]=Hipercard   "
set "$repl[14]=Credz       "
set "$repl[15]=Hiper       "

set "$count=1"
set "total=0"

:: Empty output file.
2> "%output%" echo.

:: Process input file and sum the currency.
for /f "usebackq delims=" %%A in ("%$file%") do (
    call :replace "%%A" !$count! >> "%output%"
    set /a $count+=1

    for /f "tokens=1-4" %%B in ("%%~A") do (
        if /i not "%%~B" == "total" if /i "%%~D" == "R$" (
            call :sum "%%~E"
        )
    )
)

:: Modifies total to european currency notation.
call :digits2currency "%total%"

(
    echo.
    echo TOTAL CARD VALUES CHECKED: R$ %total%
    echo.
    echo ---  FUTUROS CIELO TAN ---
) >> "%output%"

@rem mkdir "C:\Users\lojas\Desktop\Extratos Banco"
@rem move "Futuros Cielo Tan.txt" "C:\Users\lojas\Desktop\Extratos Banco\Futuros Cielo Tan.txt"

exit/b

:replace
    set "$line=%~1"
    set $repl=!$repl[%2]!
    set "$line=!$line:%$search%=%$repl%!"
    echo !$line!
    if "%2"=="1" echo.
    if "%2"=="2" echo.
exit /b

:sum
    setlocal
    set "string=%~1"
    if not defined string exit /b 0

    :: Remove separators.
    set "digits=%string:,=%"
    set "digits=%digits:.=%"

    :: Remove a leading 0 so not treated as octal notation.
    if "%digits:~0,1%" == "0" set "digits=%digits:~1%"
    if "%digits:~0,1%" == "0" set "digits=%digits:~1%"
    if not defined string set "string=0"

    endlocal & set /a "total+=%digits%"
exit /b 0

:digits2currency
    setlocal
    set "digits=%~1"

    :: Set decimal digits.
    set "subtotal=,%digits:~-2%"
    set "digits=%digits:~0,-2%"

    if defined digits goto :loop

    :: Trim 1st separator.
    set "subtotal=%subtotal:~1%"

    :: Add leading zeros.
    if "%subtotal:~0,-1%" == "" (
        set "subtotal=0,0%subtotal%"
    ) else (
        set "subtotal=0,%subtotal%"
    )

    endlocal & set "total=%subtotal%"
    exit /b

    :: Set thousandths digits.
    :loop
        set "subtotal=.%digits:~-3%%subtotal%"
        set "digits=%digits:~0,-3%"
    if defined digits goto :loop

    :: Trim 1st separator.
    set "subtotal=%subtotal:~1%"

    endlocal & set "total=%subtotal%"
exit /b 0

На основании 1-го кода и метки :replace не изменено.Прокомментированные строки mkdir и move для тестирования.

Используется как вход, который определяет настройку токенов в цикле for:

01/06/2018 à 20/03/2019
TOTAL       :  R$ 22.250,74 
Visa        :  R$ 1.086,51  
Mastercard  :  R$ 492,63  
Amex        :  R$ 0,00  
Sorocred    :  R$ 20.109,98  
Elo         :  R$ 0,00  
Diners      :  R$ 0,00  
Agiplan     :  R$ 0,00  
Banescard   :  R$ 0,00  
Cabal       :  R$ 0,00  
Credsystem  :  R$ 0,00  
Hipercard   :  R$ 0,00  
Credz       :  R$ 0,00  

Вызванная метка :sum удаляет начальный ноль, запятая и десятичная точка из каждой пройденной строки валюты.Он добавляет оставшееся целое число к итоговой переменной с помощью set /a.

Вызванная метка :digits2currency форматирует целочисленное значение total для обозначения валюты.Если только десятичное число, оно завершится рано с обновлением отформатированной строки, в противном случае - тысячные.Переменная total повторно используется из целочисленной строки в строку валюты.

Также попробуйте ввести:

01/06/2018 à 20/03/2019
TOTAL       :  R$ 0,00 
Visa        :  R$ 0,09  
Mastercard  :  R$ 0,00  
Amex        :  R$ 0,00  
Sorocred    :  R$ 0,00  
Elo         :  R$ 0,00  
Diners      :  R$ 0,00  
Agiplan     :  R$ 0,00  
Banescard   :  R$ 0,00  
Cabal       :  R$ 0,00  
Credsystem  :  R$ 0,00  
Hipercard   :  R$ 0,00  
Credz       :  R$ 0,00  

, так как сумма должна составлять 0,09.

0 голосов
/ 23 июня 2018

Карен, с учетом входного файла, futuroscielotan.txt, как ранее указано в удаленном вопросе:

01/06/2018 à 20/03/2019
Previsto:  R$ 22.250,74  
Previsto:  R$ 1.086,51  
Previsto:  R$ 492,63  
Previsto:  R$ 0,00  
Previsto:  R$ 20.109,98  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  
Previsto:  R$ 0,00  

Сценарий в вашем вопросе может выглядеть следующим образом: (не проверено) :

@Echo Off
SetLocal EnableDelayedExpansion

Set "$file=futuroscielotan.txt"
Set "$search=Previsto"
Set "$outdir=C:\Users\lojas\Desktop\Extratos Banco"
Set "$outfile=Futuros Cielo Tan.txt"

Set "$repl[2]=TOTAL       "
Set "$repl[3]=Visa        "
Set "$repl[4]=Mastercard  "
Set "$repl[5]=Amex        "
Set "$repl[6]=Sorocred    "
Set "$repl[7]=Elo         "
Set "$repl[8]=Diners      "
Set "$repl[9]=Agiplan     "
Set "$repl[10]=Banescard   "
Set "$repl[11]=Cabal       "
Set "$repl[12]=Credsystem  "
Set "$repl[13]=Hipercard   "
Set "$repl[14]=Credz       "
Set "$repl[15]=Hiper       "

If Not Exist "%$outdir%\" (MD "%$outdir%" 2>Nul || Exit /B)

Set /A $count=1,$real=$cent=0
(
    For /F "UseBackQ Delims=" %%A In ("%$file%") Do (
        Call :Replace "%%A" "!$count!"
        Set /A $count+=1
    )
    If Not "!$cent:~,-2!"=="" Set /A $real=$real+!$cent:~,-2!
    If Not "!$real:~,-3!"=="" Set "$real=!$real:~,-3!.!$real:~-3!"
    If Not "!$real:~,-7!"=="" Set "$real=!$real:~,-7!.!$real:~-7!"
    If Not "!$real:~,-11!"=="" Set "$real=!$real:~,-11!.!$real:~-11!"
    Set "$cent=0!$cent!"
    Echo(
    Echo TOTAL CARD VALUES CHECKED:  R$ !$real!,!$cent:~-2!
    Echo(
    Echo ---  FUTUROS CIELO TAN ---
)>"%$outdir%\%$outfile%"

Pause
Exit /B

:Replace
Set "$line=%~1"
If %~2 GEq 3 Call :Calcs !$line:*$=!
Set "$repl=!$repl[%~2]!"
Set "$line=!$line:%$search%=%$repl%!"
Echo %$line%
If %~2 Equ 1 Echo(
If %~2 Equ 2 Echo(
Exit /B

:Calcs
If %1 Gtr 0 (Set "$_r=%1"
    Set "$_r=!$_r:.=!"
    Set /A $real+=$_r)
If %2 Gtr 0 (Set /A $_c=10%2%%100
    Set /A $cent+=$_c)
Exit /B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...