使用.csv文件上的批处理分别汇总同一列中每个内容的总计值

时间:2019-05-17 12:06:05

标签: csv batch-file

我使这个脚本如下:

@echo off
setlocal enabledelayedexpansion

(for /f "skip=2 tokens=2,3,7 delims=;" %%a in (1.csv) do (
  set "a=%%a                           "
  set "b=%%b              "
  for /f "tokens=1,*" %%m in ("%%c") do (set "c=     %%m" & set "d= %%n")
  echo !a:~0,22!!b:~0,17!!c!!d:~-10!
))>2.csv
<2.csv set /p header=

(echo %header%
more +1 2.csv |sort /+22) >3.csv


set "NewFile=4.csv"

set "TotalElo=0"
set "TotalMastercard=0"
set "TotalAmericanExpress=0"
set "TotalVisa=0"
set "TotalOther1=0"
set "TotalOther2=0"
set "TotalOther3=0"

for %%I in (3.csv) do (
    for /F "skip=1 tokens=3 delims=" %%A in ("%%I") do (

            set /A TotalElo+=%%A
            set /A TotalMastercard+=%%B
            set /A TotalAmericanExpress+=%%C
            set /A TotalVisa+=%%D
            set /A TotalOther1+=%%E
            set /A TotalOther2+=%%F
            set /A TotalOther3+=%%G

            >>"%NewFile%" echo %%A,%%B,%%C,%%D,%%D,%%E,%%F,%%G


    )
)

>>"%NewFile%" echo Total,%TotalElo%,%TotalAmericanExpress%,%TotalVisa%,%TotalOther1%,%TotalOther2%,%TotalOther3%
move "%NewFile%" "lalala.csv" >nul

:EndBatch
endlocal

我希望我的输出lalala.csv像这样:

Previsão de pagamento Bandeira              Valor líquido
21/05/2019            American Express      R$ 17,95
21/06/2019            American Express      R$ 17,95
13/05/2019            Elo                   R$ 1.415,08
15/05/2019            Elo                   R$ 1.474,79
30/05/2019            Elo                   R$ 100,91
04/09/2019            Elo                   R$ 104,73
08/07/2019            Elo                   R$ 87,31
03/05/2019            Elo                   R$ 950,61
12/09/2019            Mastercard            R$ 100,20
13/08/2019            Mastercard            R$ 100,20
10/06/2019            Mastercard            R$ 104,36
06/05/2019            Mastercard            R$ 129,56
06/06/2019            Mastercard            R$ 136,96
14/10/2019            Mastercard            R$ 151,00
24/06/2019            Visa                  R$ 104,85
14/06/2019            Visa                  R$ 111,01
14/08/2019            Visa                  R$ 111,01
15/07/2019            Visa                  R$ 111,01
16/10/2019            Visa                  R$ 127,29
09/05/2019            Visa                  R$ 15,05
15/08/2019            Visa                  R$ 163,55
16/09/2019            Visa                  R$ 163,55
14/06/2019            Visa                  R$ 90,56

Total VISA: R$ value...
Total ELO:  R$ value...
Total AMERICAN EXPRESS: R$ value...
Total OHTER 1: R$ value...
etc.

但是我的输出结果仅仅是这样:Total,0,0,0,0,0,0

我没有找到错误。

此问题的信息涉及此其他问题中包含的其他情况: Organize rows, columns and values in a .csv file with batch script


编辑1:

我的3.csv是:

Previsão de pagamento Bandeira              Valor líquido
21/05/2019            American Express      R$17,95 
21/06/2019            American Express      R$17,95 
13/05/2019            Elo                   R$1.415,08 
30/05/2019            Elo                   R$99.125,91 
04/09/2019            Elo                   R$125.132,73 
05/07/2019            Elo                   R$104,73 
05/08/2019            Elo                   R$104,73 
07/10/2019            Elo                   R$104,73 
04/06/2019            Elo                   R$104,75 
16/05/2019            Elo                   R$109,05 
13/06/2019            Elo                   R$122,05 
14/05/2019            Elo                   R$122,08 
24/07/2019            Elo                   R$129,20 
06/05/2019            Elo                   R$136,09 
23/05/2019            Elo                   R$138,16 
14/08/2019            Elo                   R$139,78 
20/09/2019            Elo                   R$144,02 
21/10/2019            Elo                   R$144,02 
24/05/2019            Elo                   R$159,20 
11/06/2019            Elo                   R$16,55 
10/05/2019            Elo                   R$164,37 
14/06/2019            Elo                   R$168,82 
20/08/2019            Elo                   R$183,85 
16/09/2019            Elo                   R$197,34 
15/07/2019            Elo                   R$199,75 
12/07/2019            Elo                   R$208,71 
23/05/2019            Elo                   R$214,40 
06/05/2019            Elo                   R$22,42 
07/05/2019            Elo                   R$233,96 
20/05/2019            Elo                   R$238,07 
19/07/2019            Elo                   R$25,13 
19/08/2019            Elo                   R$25,13 
09/05/2019            Elo                   R$25,39 
02/08/2019            Elo                   R$25,80 
03/07/2019            Elo                   R$25,80 
22/07/2019            Elo                   R$253,45 
02/05/2019            Elo                   R$28,00 
31/05/2019            Elo                   R$28,00 
31/07/2019            Elo                   R$28,00 
21/06/2019            Elo                   R$292,31 
21/05/2019            Elo                   R$292,34 
24/06/2019            Elo                   R$297,30 
14/05/2019            Elo                   R$306,36 
10/05/2019            Elo                   R$307,12 
13/05/2019            Elo                   R$327,45 
17/06/2019            Elo                   R$337,36 
11/06/2019            Elo                   R$345,08 
08/05/2019            Elo                   R$353,11 
24/10/2019            Elo                   R$36,06 
10/06/2019            Elo                   R$39,06 
26/06/2019            Elo                   R$40,50 
27/05/2019            Elo                   R$40,50 
29/07/2019            Elo                   R$40,50 
10/06/2019            Elo                   R$407,22 
16/05/2019            Elo                   R$439,53 
27/06/2019            Elo                   R$46,42 
28/05/2019            Elo                   R$46,42 
09/05/2019            Elo                   R$462,10 
06/05/2019            Elo                   R$472,44 
17/05/2019            Elo                   R$472,48 
09/08/2019            Elo                   R$51,65 
09/09/2019            Elo                   R$51,65 
10/07/2019            Elo                   R$51,65 
10/10/2019            Elo                   R$51,65 
04/07/2019            Elo                   R$53,81 
12/06/2019            Elo                   R$55,50 
15/05/2019            Elo                   R$57,08 
16/08/2019            Elo                   R$57,56 
02/05/2019            Elo                   R$588,24 
29/08/2019            Elo                   R$59,25 
30/07/2019            Elo                   R$59,25 
30/09/2019            Elo                   R$59,25 
13/08/2019            Elo                   R$59,97 
23/07/2019            Elo                   R$60,29 
16/07/2019            Elo                   R$65,16 
19/06/2019            Elo                   R$67,42 
18/06/2019            Elo                   R$68,64 
11/09/2019            Elo                   R$73,14 
12/08/2019            Elo                   R$73,14 
14/10/2019            Elo                   R$73,14 
11/07/2019            Elo                   R$74,71 
13/05/2019            Elo                   R$75,19 
17/07/2019            Elo                   R$76,91 
03/06/2019            Elo                   R$79,62 
05/06/2019            Elo                   R$82,27 
23/08/2019            Elo                   R$86,70 
23/09/2019            Elo                   R$86,70 
01/07/2019            Elo                   R$87,25 
06/06/2019            Elo                   R$87,31 
07/05/2019            Elo                   R$87,31 
08/07/2019            Elo                   R$87,31 
03/05/2019            Elo                   R$950,61 
15/05/2019            Elo                   R$99.474,79 
12/09/2019            Mastercard            R$100,20 
13/08/2019            Mastercard            R$100,20 
10/06/2019            Mastercard            R$104,36 
06/05/2019            Mastercard            R$129,56 
06/06/2019            Mastercard            R$136,96 
14/10/2019            Mastercard            R$151,00 
12/06/2019            Mastercard            R$17,96 
11/06/2019            Mastercard            R$24,14 
15/05/2019            Mastercard            R$306,89 
19/06/2019            Mastercard            R$31,16 
20/05/2019            Mastercard            R$31,16 
22/07/2019            Mastercard            R$32,23 
14/06/2019            Mastercard            R$374,27 
13/06/2019            Mastercard            R$38,71 
14/05/2019            Mastercard            R$38,71 
04/06/2019            Mastercard            R$39,06 
15/07/2019            Mastercard            R$425,07 
13/09/2019            Mastercard            R$50,80 
14/08/2019            Mastercard            R$50,80 
17/06/2019            Mastercard            R$50,82 
10/05/2019            Mastercard            R$61,36 
24/06/2019            Mastercard            R$64,60 
23/05/2019            Mastercard            R$64,62 
21/05/2019            Mastercard            R$70,57 
21/06/2019            Mastercard            R$70,57 
13/05/2019            Mastercard            R$80,40 
13/05/2019            Mastercard            R$84,56 
10/06/2019            Mastercard            R$99,66 
08/05/2019            Mastercard            R$99.324,18 
24/06/2019            Visa                  R$104,85 
14/06/2019            Visa                  R$111,01 
14/08/2019            Visa                  R$111,01 
15/07/2019            Visa                  R$111,01 
16/10/2019            Visa                  R$127,29 
09/05/2019            Visa                  R$15,05 
15/08/2019            Visa                  R$163,55 
16/09/2019            Visa                  R$163,55 
09/08/2019            Visa                  R$19,26 
09/09/2019            Visa                  R$19,26 
10/05/2019            Visa                  R$19,26 
10/07/2019            Visa                  R$19,26 
16/07/2019            Visa                  R$194,36 
17/06/2019            Visa                  R$194,42 
06/05/2019            Visa                  R$254,65 
29/05/2019            Visa                  R$33,85 
10/06/2019            Visa                  R$34,31 
10/05/2019            Visa                  R$344,33 
19/06/2019            Visa                  R$36,81 
19/08/2019            Visa                  R$36,81 
22/07/2019            Visa                  R$36,81 
23/05/2019            Visa                  R$41,09 
23/07/2019            Visa                  R$41,09 
21/06/2019            Visa                  R$48,95 
22/05/2019            Visa                  R$48,95 
16/05/2019            Visa                  R$49,08 
15/05/2019            Visa                  R$58,83 
27/05/2019            Visa                  R$63,76 
20/05/2019            Visa                  R$64,19 
27/06/2019            Visa                  R$65,31 
28/05/2019            Visa                  R$65,31 
13/06/2019            Visa                  R$82,88 
14/05/2019            Visa                  R$82,88 
13/05/2019            Visa                  R$88,30 
14/06/2019            Visa                  R$90,56 

2 个答案:

答案 0 :(得分:3)

  

这不是答案,这是斯蒂芬(Stephan)的回答,但是我不能编辑也不能将其作为评论...为了消除限制(虽然是的,更复杂)代码,请参见Macros with parameters appended

@echo off
SetLocal EnableExtensions DisableDelayedExpansion

:: see http://www.dostips.com/forum/viewtopic.php?f=3&t=2518
set ^"LF=^

^" don't remove previous line     & rem newline
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"  & rem newline with line continuation

:: get string length
set STRLEN=for %%{ in (1 2) do if %%{==2 (%\n%
  for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
    set "S=A!%%~2!"^&set "L=0"%\n%
    for /L %%A in (12,-1,0) do (set/a "L|=1<<%%A"^&for %%B in (!L!) do if "!S:~%%B,1!"=="" set/a "L&=~1<<%%A")%\n%
    for /F "delims=" %%} in ("!L!") do EndLocal^& set "%%1=%%~}"%\n%
  )%\n%
) else SetLocal EnableDelayedExpansion ^& set argv=,
SetLocal EnableDelayedExpansion

set /a "len=0, maxLen=0"

for /f "skip=1 delims=" %%a in (3.csv) do (
  set "line=%%a"
  set "card=!line:~22,20!"
  set "value=!line:~47!"
  set "value=!value:,=!"
  set "value=!value:.=!"
  set /a _!card: =! += !value!, GrandTotal+=!value!
  set "line=!line:~0,47!!value!"
  %STRLEN% len,line
  if !len! GTR !maxLen! set/a maxLen=!len!
)

set "padding=------------------------------------------------------------"

(
  type 3.csv & echo(
  echo(!padding:~0,%maxLen%!
  for /f "tokens=1,2 delims=_=" %%a in ('set _') do (
    set "sum=%%b"
    call :makeCurrencyReadable "Total %%a: ", "%%b", sum
    echo !sum!
  )
  echo(!padding:~0,%maxLen%!
  call :makeCurrencyReadable "GRAND TOTAL: ", "!GrandTotal!", GrandTotal
  echo !GrandTotal!
) >5.csv

EndLocal
EndLocal
exit/B

::these two may be also be macros (but I'm too lazy today)
:makeCurrencyReadable header, value, variable
SetLocal EnableDelayedExpansion
set "str="
set "header=%~1" & set "padding=                                                            "
set/a "len=0, lenN=0, pad=20, maxTitle=maxLen-(pad+1)"
call :makeNumberReadable "%~2", str, lenN
%STRLEN% lenN,str
set /a "lenN=pad-lenN"
set "header=!header!!padding!"
set "str=!header:~0,%maxTitle%!!padding:~0,%lenN%!!str!"
EndLocal & set "%3=%str%"

:makeNumberReadable value, variable
SetLocal EnableDelayedExpansion
set "res=%~1"
set "str=!res:~0,-2!" & set "dec=!res:~-2!" & set "res="
set/a "len=0, current=0, now=0, dot=0"
%STRLEN% len,str
set/a len-=1
for /L %%i in (%len%,-1,0) do (
    set /A "current+=1, now=current%%3"
    if !dot! EQU 1 (set "res=.!res!" & set/a "dot=0")
    set "res=!str:~%%i,1!!res!"
    if !now! EQU 0 (set /A "dot=1")
)
EndLocal & set "%2=%res%,%dec%"
goto:eof

答案 1 :(得分:2)

以纯批处理的方式需要很多技巧(原因:DataStructure和我们只能处理INT32个数字的事实)

@echo off
setlocal enabledelayedexpansion

for /f "skip=1 delims=" %%a in (3.csv) do ( 
  set "line=%%a"
  set "card=!line:~22,20!"
  set "value=!line:~46!"
  set "value=!value:,=!"
  set "value=!value:.=!"
  set /a _!card: =! += !value!
)
>4.csv (
  type 3.csv
  echo(
  for /f "tokens=1,2 delims=_=" %%a in ('set _') do (
    set /a GrandTotal+=%%b
    call :formatvalue %%b
    echo Total %%a: !sum!
  )
echo(
call :formatvalue !GrandTotal!
echo Grand Total: !sum!
)
goto  :eof

:formatvalue
set "sum=    %1"
set "sum=%sum:~0,-2%,%sum:~-2%"
if not "%sum:~-7,1%" == " " set "sum=    %sum:~0,-6%.%sum:~-6%"
if not "%sum:~-11,1%" == " " set "sum=    %sum:~0,-10%.%sum:~-10%"
if not "%sum:~-15,1%" == " " set "sum=%sum:~0,-14%.%sum:~-14%"
set "sum=%sum: =%"
goto :eof

输出(4.csv

...

Total AmericanExpress: 35,90
Total Elo: 338.225,03
Total Mastercard: 102.154,58
Total Visa: 3.041,89

Grand Total: 443.457,40

首先进行for循环以提取数据并添加不同卡类型的值。
第二个for重新格式化并显示总和。

在此过程中,我们在卡名称(American Express-> AmericanExpress中放开了空格,并且卡按字母顺序排序,但是我想,您可以接受它。

修改 只是逐步显示了子例程的扩展的独立“调试版本”,具体发生了什么:

@echo off
setlocal 

call :formatvalue 123456789
echo Result: %sum%
goto  :eof

:formatvalue
set "sum=    %1"
echo step 0 sum="%sum%"

echo step 1 sum="%sum%", sub1="%sum:~0,-2%", sub2="%sum:~-2%"
set "sum=%sum:~0,-2%,%sum:~-2%"
echo step 2 sum="%sum%"

echo teststring 1="%sum:~-7,1%"; sub1="%sum:~0,-6%" ; sub2="%sum:~-6%"
if not "%sum:~-7,1%" == " " set "sum=    %sum:~0,-6%.%sum:~-6%"
echo step 3 sum="%sum%"

echo teststring 2="%sum:~-11,1%"; sub1="%sum:~0,-10%" ; sub2="%sum:~-10%"
if not "%sum:~-11,1%" == " " set "sum=    %sum:~0,-10%.%sum:~-10%"
echo step 4 sum="%sum%"

echo teststring 3="%sum:~-15,1%"; sub1="%sum:~0,-14%" ; sub2="%sum:~-14%"
if not "%sum:~-15,1%" == " " set "sum=%sum:~0,-14%.%sum:~-14%"
echo step 5 sum="%sum%"

set "sum=%sum: =%"
echo step 6 sum="%sum%"

goto :eof

这应该有助于您了解子字符串的操作。也尝试call :formatvalue 123甚至call :formatvalue abcdefghi(工作原理完全一样,因为它只是字符串-cmd对数字一无所知(set /a进行有限的整数处理除外))

您说,您的3.csv一直在变化,因此您需要了解以适应脚本。

仅需注意:elzooilogico的例程:makeNumberReadable(从程序员的角度来看)更为优雅,并且可能更快(没有尝试),但是以您目前的理解水平,我什至不会尝试解释它对您-无意冒犯。