标题: [文件操作] [已解决]批处理将文件名中的汉字序数转换成阿拉伯数字序数 [打印本页]
作者: 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回,可以这样:- @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!
- )
- set n=0!n!
- set n=!n:~-2!
- ren "第%%a回%%b" "第!n!回%%b"
- )
- 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,变量值也不对,导致错误的发生。修改时不需要这么复杂。改为下面的代码即可:复制代码
欢迎再次测试!!!
作者: whink 时间: 2022-8-3 14:39
按照楼上大神的修正后的代码,一次成功。感激不尽
作者: idwma 时间: 2022-8-3 14:57
本帖最后由 idwma 于 2022-8-3 14:59 编辑
回复 3# qixiaobin0715
看了前辈们的受益良多,来练习一下- @echo off
- setlocal enabledelayedexpansion
- set str=九万九千九百九十九
- set _零=0
- for %%i in (一 二 三 四 五 六 七 八 九) do (
- set /a x+=1
- set _%%i=!x!
- )
- set x=1
- for %%i in (十 百 千 万) do (
- set /a x*=10
- set _%%i=!x!
- )
-
- set x=0
- :to
- set /a xx=x+1
- set m1=!str:~%x%,1!
- set m2=!str:~%xx%,1!
- if "%m1%"=="" (
- echo %n%
- pause
- goto :eof
- )
- if "%m2%"=="十" (
- set /a n+=!_%m1%!*!_%m2%!
- set /a x+=2
- ) else if "%m2%"=="百" (
- set /a n+=!_%m1%!*!_%m2%!
- set /a x+=2
- ) else if "%m2%"=="千" (
- set /a n+=!_%m1%!*!_%m2%!
- set /a x+=2
- ) else if "%m2%"=="万" (
- set /a n+=!_%m1%!*!_%m2%!
- set /a x+=2
- ) else (
- set m1=!str:~%x%,1!
- set /a n+=!_%m1%!
- set /a x+=1
- )
- goto :to
复制代码
作者: qixiaobin0715 时间: 2022-8-3 15:11
回复 7# idwma
正点!!!
作者: qixiaobin0715 时间: 2022-8-4 14:07
本帖最后由 qixiaobin0715 于 2022-8-4 16:43 编辑
有样学样,适合数值小于十万。来一个不用goto的:- @echo off
- setlocal enabledelayedexpansion
- set str=九万九千九百九十九
- set str=!str:零=!
- for %%i in (一 二 三 四 五 六 七 八 九) do (
- set /a x+=1
- set _%%i=!x!
- )
- set x=1
- for %%i in (十 百 千 万) do (
- set /a x*=10
- set #%%i=!x!
- set %%i=1
- )
- for /l %%i in (0,2,8) do (
- set var=!str:~%%i,2!
- if not "!var!"=="" (
- if not "!var:~1!"=="" set /a m1=!var:~1!
- set /a m2=!var:~,1!
- if "!m1!"=="1" (
- set /a n+=_!var:~,1!*#!var:~1!
- ) else if "!m2!"=="1" (
- set /a n+=#!var:~,1!+_!var:~1!
- ) else (
- set /a n+=_!var!
- )
- set m1=
- set m2=
- )
- )
- echo,!n!
- set n=
- 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这个来改一下- @echo off
- setlocal enabledelayedexpansion
- set strr=九千九百九十九亿九千九百九十九万九千九百九十九
- set strr=!strr:零=!
- for %%i in (一 二 三 四 五 六 七 八 九) do (
- set /a x+=1
- set _%%i=!x!
- )
- set x=1
- for %%i in (十 百 千 万 亿) do (
- set /a x*=10
- set #%%i=!x!
- set %%i=1
- )
- set #万=1000
- set #亿=1000
-
- for %%a in (%strr:千= %) do (
- set str=%%a
- set str=!str:万=千!
- set str=!str:亿=千!
- for /l %%i in (0,2,8) do (
- set var=!str:~%%i,2!
- if not "!var!"=="" (
- if not "!var:~1!"=="" set /a m1=!var:~1!
- set /a m2=!var:~,1!
- if "!m1!"=="1" (
- set /a n+=_!var:~,1!*#!var:~1!
- ) else if "!m2!"=="1" (
- set /a n+=#!var:~,1!+_!var:~1!
- ) else (
- set /a n+=_!var!
- )
- set m1=
- set m2=
- )
- )
- set nn=!nn!!n!
- set n=
- )
- echo,!nn!
- 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):- @echo off
- set m=3
- setlocal enabledelayedexpansion
- for %%i in (一 二 三 四 五 六 七 八 九) do (
- set /a x+=1
- set /a _%%i=!x!
- set y=1
- for %%j in (十 百 千) do (
- set /a y*=10
- set /a _%%i%%j=!x!*!y!
- )
- )
- set _十=10
- for /f "tokens=1* delims=第回" %%a in ('dir /b /a-d "*.m4a"') do (
- set str=%%a
- set str=!str:零=!
- for %%i in (十 百 千) do set str=!str:%%i=%%i !
- set n=10000
- for %%j in (!str!) do set /a n+=_%%j
- ren "第%%a回%%b" "第!n:~-%m%!回%%b"
- )
- pause
复制代码
代码另存为ANSI编码,未经测试。
代码第2行m=3为保留3位数字,可以自行修改,范围是2~4。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |