我使这个脚本如下:
@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
答案 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
(从程序员的角度来看)更为优雅,并且可能更快(没有尝试),但是以您目前的理解水平,我什至不会尝试解释它对您-无意冒犯。