Board logo

标题: [文件操作] [已解决]批处理将文件名中的汉字序数转换成阿拉伯数字序数 [打印本页]

作者: whink    时间: 2022-8-2 12:21     标题: [已解决]批处理将文件名中的汉字序数转换成阿拉伯数字序数

将文件名中的汉字序数转换成阿拉伯数字序数,能够补全位数和最大的数字位数一样最好。例如“第八十八回” 回改为 第88回,第三回改为 第03回。

第八十八回:求取真经终得圆满.m4a
第三十五回:车迟国智斗三大仙(下).m4a
第七十九回:可怕的九头狮子怪.m4a
第二十九回:金角和银角二魔王(下).m4a
第二十八回:金角和银角二魔王(上).m4a
第二十五回:孙悟空三打白骨精.m4a
第三回:东海龙宫的金箍棒.m4a
第七十五回:在连环洞口中了计.m4a
作者: hfxiang    时间: 2022-8-2 16:18

这个目前好像只能用枚举法,截取冒号前的字符串进行替换,俺之前曾经实现过100之内的替换,只是目前bat源码一下子没找到。
作者: qixiaobin0715    时间: 2022-8-2 16:25

本帖最后由 qixiaobin0715 于 2022-8-2 16:27 编辑

如果简单的像你列举的那样,章回数不超过100回,可以这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (一 二 三 四 五 六 七 八 九 十) do (
  4. set /a x+=1
  5. set _%%i=!x!
  6. )
  7. for /f "tokens=1* delims=第回" %%a in ('dir /b /a-d "*.m4a"') do (
  8.     set str=%%a
  9.     set m1=!str:~,2!
  10.     set m2=!str:~2,1!
  11.     if "!m1:~,1!"=="十" (
  12.         set /a n=10+_!m1:~1,1!
  13.     ) else if "!m1:~1,1!"=="十" (
  14.         set /a n=_!m1:~,1!*10+_!m2!
  15.     ) else (
  16.         set n=_!m2!
  17.     )
  18.     set n=0!n!
  19.     set n=!n:~-2!
  20.     ren "第%%a回%%b" "第!n!回%%b"
  21. )
  22. pause
复制代码
代码另存为ANSI编码。未经测试。
作者: hfxiang    时间: 2022-8-2 18:28

回复 3# qixiaobin0715


    厉害!!!
测试了一下,“一~九”回好像不太正常工作,俺擅自补充了一下并通过测试(版权还是大神你的)

@echo off
setlocal enabledelayedexpansion
for %%i in (一 二 三 四 五 六 七 八 九 十) do (
set /a x+=1
set _%%i=!x!
)
for /f "tokens=1* delims=第回" %%a in ('dir /b /a-d "*.m4a"') do (
        set str=%%a
        set m1=!str:~,2!
        set m2=!str:~2,1!
        if "!m1:~,1!"=="十" (
                set /a n=10+_!m1:~1,1!
        ) else if "!m1:~1,1!"=="十" (
                set /a n=_!m1:~,1!*10+_!m2!
        ) else (
                set n=_!m2!
        )
        call set "str1=%%str:十=%%"
        if !str1!. EQU !str!. set /a n=0+_!m1!
        set n=0!n!
        set n=!n:~-2!
        ren "第%%a回%%b" "第!n!回%%b"
)
endlocal
作者: qixiaobin0715    时间: 2022-8-3 08:21

回复 4# hfxiang
谢谢测试代码。
有几点要说明的是:
1.不存在版权问题。实际上都是在抄写前辈们的代码,只不过构架不同而已;
2.由于主要变量都是数字形式,这里采用set /a就是为了避免变量嵌套带来的麻烦,可以自己体会一下;
3.谢谢指正代码中的错误。实际上写代码时,3楼代码第16行变量设置时漏掉了参数/a,变量值也不对,导致错误的发生。修改时不需要这么复杂。改为下面的代码即可:
  1. set /a n=_!m1!
复制代码
欢迎再次测试!!!
作者: whink    时间: 2022-8-3 14:39

按照楼上大神的修正后的代码,一次成功。感激不尽
作者: idwma    时间: 2022-8-3 14:57

本帖最后由 idwma 于 2022-8-3 14:59 编辑

回复 3# qixiaobin0715


    看了前辈们的受益良多,来练习一下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=九万九千九百九十九
  4. set _零=0
  5. for %%i in (一 二 三 四 五 六 七 八 九) do (
  6.     set /a x+=1
  7.     set _%%i=!x!
  8. )
  9. set x=1
  10. for %%i in (十 百 千 万) do (
  11.     set /a x*=10
  12.     set _%%i=!x!
  13. )
  14. set x=0
  15. :to
  16. set /a xx=x+1
  17. set m1=!str:~%x%,1!
  18. set m2=!str:~%xx%,1!
  19. if "%m1%"=="" (
  20.     echo %n%
  21.     pause
  22.     goto :eof
  23. )
  24. if "%m2%"=="十" (
  25.     set /a n+=!_%m1%!*!_%m2%!
  26.     set /a x+=2
  27. ) else if "%m2%"=="百" (
  28.     set /a n+=!_%m1%!*!_%m2%!
  29.     set /a x+=2
  30. ) else if "%m2%"=="千" (
  31.     set /a n+=!_%m1%!*!_%m2%!
  32.     set /a x+=2
  33. ) else if "%m2%"=="万" (
  34.     set /a n+=!_%m1%!*!_%m2%!
  35.     set /a x+=2
  36. ) else (
  37.     set m1=!str:~%x%,1!
  38.     set /a n+=!_%m1%!
  39.     set /a x+=1
  40. )
  41. goto :to
复制代码

作者: qixiaobin0715    时间: 2022-8-3 15:11

回复 7# idwma
正点!!!
作者: qixiaobin0715    时间: 2022-8-4 14:07

本帖最后由 qixiaobin0715 于 2022-8-4 16:43 编辑

有样学样,适合数值小于十万。来一个不用goto的:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=九万九千九百九十九
  4. set str=!str:零=!
  5. for %%i in (一 二 三 四 五 六 七 八 九) do (
  6.     set /a x+=1
  7.     set _%%i=!x!
  8. )
  9. set x=1
  10. for %%i in (十 百 千 万) do (
  11.     set /a x*=10
  12.     set #%%i=!x!
  13.     set %%i=1
  14. )
  15. for /l %%i in (0,2,8) do (
  16.     set var=!str:~%%i,2!
  17.     if not "!var!"=="" (
  18.         if not "!var:~1!"=="" set /a m1=!var:~1!
  19.         set /a m2=!var:~,1!
  20.         if "!m1!"=="1" (
  21.             set /a n+=_!var:~,1!*#!var:~1!
  22.         ) else if "!m2!"=="1" (
  23.             set /a n+=#!var:~,1!+_!var:~1!
  24.         ) else (
  25.             set /a n+=_!var!
  26.         )
  27.         set m1=
  28.         set m2=
  29.     )
  30. )
  31. echo,!n!
  32. set n=
  33. pause
复制代码

作者: aloha20200628    时间: 2022-8-6 11:40

转一个老人batman在2009年的老帖如下
【批处理如何把中文数字转换成阿拉伯数字?】http://www.bathome.net/thread-6326-1-1.html
用分段求和的方法能做到上亿。其算法可续用于更高位,但有批处理32位正整数上限(2147483647),只能作罢...
作者: idwma    时间: 2022-8-6 13:21

回复 10# aloha20200628


    是不是可以按千分号分段,算完把每段按顺序用字符的方法拼起来,就不受数字上限了
作者: aloha20200628    时间: 2022-8-6 14:21

第一个段点是'万',第二个段点是'亿',但批处理有正整数上限,过2亿,set/a就没戏了。
作者: idwma    时间: 2022-8-6 15:50

回复 12# aloha20200628


    按千分段的想法大概像这样,就拿0751这个来改一下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set strr=九千九百九十九亿九千九百九十九万九千九百九十九
  4. set strr=!strr:零=!
  5. for %%i in (一 二 三 四 五 六 七 八 九) do (
  6.     set /a x+=1
  7.     set _%%i=!x!
  8. )
  9. set x=1
  10. for %%i in (十 百 千 万 亿) do (
  11.     set /a x*=10
  12.     set #%%i=!x!
  13.     set %%i=1
  14. )
  15. set #万=1000
  16. set #亿=1000
  17. for %%a in (%strr:千= %) do (
  18. set str=%%a
  19. set str=!str:万=千!
  20. set str=!str:亿=千!
  21. for /l %%i in (0,2,8) do (
  22.     set var=!str:~%%i,2!
  23.     if not "!var!"=="" (
  24.         if not "!var:~1!"=="" set /a m1=!var:~1!
  25.         set /a m2=!var:~,1!
  26.         if "!m1!"=="1" (
  27.             set /a n+=_!var:~,1!*#!var:~1!
  28.         ) else if "!m2!"=="1" (
  29.             set /a n+=#!var:~,1!+_!var:~1!
  30.         ) else (
  31.             set /a n+=_!var!
  32.         )
  33.         set m1=
  34.         set m2=
  35.     )
  36. )
  37. set nn=!nn!!n!
  38. set n=
  39. )
  40. echo,!nn!
  41. pause
复制代码

作者: qixiaobin0715    时间: 2022-8-9 09:13

回复 13# idwma
好像还是有bug。比如:十亿零九。1000000009
作者: qixiaobin0715    时间: 2022-8-13 09:55

本帖最后由 qixiaobin0715 于 2022-8-13 11:19 编辑

回复 6# whink
一般来说小说的章回都不会超过10000吧。代码可以写的更通用一些(适合章回数小于10000):
  1. @echo off
  2. set m=3
  3. setlocal enabledelayedexpansion
  4. for %%i in (一 二 三 四 五 六 七 八 九) do (
  5.     set /a x+=1
  6.     set /a _%%i=!x!
  7.     set y=1
  8.     for %%j in (十 百 千) do (
  9.         set /a y*=10
  10.         set /a _%%i%%j=!x!*!y!
  11.     )
  12. )
  13. set _十=10
  14. for /f "tokens=1* delims=第回" %%a in ('dir /b /a-d "*.m4a"') do (
  15.     set str=%%a
  16.     set str=!str:零=!
  17.     for %%i in (十 百 千) do set str=!str:%%i=%%i !
  18.     set n=10000
  19.     for %%j in (!str!) do set /a n+=_%%j
  20.     ren "第%%a回%%b" "第!n:~-%m%!回%%b"
  21. )
  22. pause
复制代码
代码另存为ANSI编码,未经测试。
代码第2行m=3为保留3位数字,可以自行修改,范围是2~4。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2