Board logo

标题: [文件操作] 如何实现将文件名中的中文数字转换成阿拉伯数字并且不够指定位数的在前面添加前导0 [打印本页]

作者: mm123321    时间: 2017-6-22 10:40     标题: 如何实现将文件名中的中文数字转换成阿拉伯数字并且不够指定位数的在前面添加前导0

本帖最后由 pcl_test 于 2017-6-22 16:01 编辑

【难度】麻烦大神帮我看一下怎么写呢 就是如下图所示!
原文件名称                批处理修改后的文件名称
第一章 XXXXXXXX 第一节 XXXXX.avi        →        第01章 XXXXXXXX 第01节 XXXXX.avi
第一章 XXXXXXXX 第二节 XXXXX.avi        →        第01章 XXXXXXXX 第02节 XXXXX.avi
第一章 XXXXXXXX 第三节 XXXXX.avi        →        第01章 XXXXXXXX 第03节 XXXXX.avi
第一章 XXXXXXXX 第四节 XXXXX.avi        →        第01章 XXXXXXXX 第04节 XXXXX.avi
第二章 XXXXXXXX 第一节 XXXXX.avi        →        第02章 XXXXXXXX 第01节 XXXXX.avi
第二章 XXXXXXXX 第二节 XXXXX.avi        →        第02章 XXXXXXXX 第02节 XXXXX.avi
第二章 XXXXXXXX 第三节 XXXXX.avi        →        第02章 XXXXXXXX 第03节 XXXXX.avi
第二章 XXXXXXXX 第四节 XXXXX.avi        →        第02章 XXXXXXXX 第04节 XXXXX.avi
第二章 XXXXXXXX 第五节 XXXXX.avi        →        第02章 XXXXXXXX 第05节 XXXXX.avi
第二章 XXXXXXXX 第六节 XXXXX.avi        →        第02章 XXXXXXXX 第06节 XXXXX.avi
第二章 XXXXXXXX 第七节 XXXXX.avi        →        第02章 XXXXXXXX 第07节 XXXXX.avi
               
另外当遇到→就是序号不是两位的补0成为两位的               
原文件名称                批处理修改后的文件名称
第01章 XXXXXXXX 第1节 XXXXX.avi        →        第01章 XXXXXXXX 第01节 XXXXX.avi
第01章 XXXXXXXX 第2节 XXXXX.avi        →        第01章 XXXXXXXX 第02节 XXXXX.avi
第01章 XXXXXXXX 第3节 XXXXX.avi        →        第01章 XXXXXXXX 第03节 XXXXX.avi
第01章 XXXXXXXX 第4节 XXXXX.avi        →        第01章 XXXXXXXX 第04节 XXXXX.avi
第02章 XXXXXXXX 第01节 XXXXX.avi        →        第02章 XXXXXXXX 第01节 XXXXX.avi
第02章 XXXXXXXX 第02节 XXXXX.avi        →        第02章 XXXXXXXX 第02节 XXXXX.avi
第02章 XXXXXXXX 第03节 XXXXX.avi        →        第02章 XXXXXXXX 第03节 XXXXX.avi
第02章 XXXXXXXX 第04节 XXXXX.avi        →        第02章 XXXXXXXX 第04节 XXXXX.avi
第02章 XXXXXXXX 第05节 XXXXX.avi        →        第02章 XXXXXXXX 第05节 XXXXX.avi
第02章 XXXXXXXX 第06节 XXXXX.avi        →        第02章 XXXXXXXX 第06节 XXXXX.avi
第02章 XXXXXXXX 第07节 XXXXX.avi        →        第02章 XXXXXXXX 第07节 XXXXX.avi
作者: mm123321    时间: 2017-6-22 15:43

版主帮我总结的标题就是我要表达的意思,神人版主!
作者: taofan712    时间: 2017-6-22 21:18

本帖最后由 taofan712 于 2017-6-23 16:34 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.avi) do (
  4.     set "fn=%%~a"
  5.     for /f "tokens=1,3 delims= " %%b in ("%%~a") do (
  6.         for /f "tokens=1,2 delims=第章节 " %%d in ("%%b%%c") do (
  7.             set tmpstr_d=%%dfedcba9876543210&set/a len_d=0x!tmpstr_d:~15,1!
  8.             set tmpstr_e=%%efedcba9876543210&set/a len_e=0x!tmpstr_e:~15,1!
  9.             call :change %%d !len_d! ret_d
  10.             call :change %%e !len_e! ret_e
  11.             call set fnew=%%fn:第%%d章=第!ret_d!章%%
  12.             call set fnew=%%fnew:第%%e节=第!ret_e!节%%
  13.             ren "%%~a" "!fnew!"
  14.         )
  15.     )
  16. )
  17. echo;处理完毕&pause>nul&exit /b
  18. :change
  19. set num=%1
  20. set n=1
  21. for %%i in (一 二 三 四 五 六 七 八 九) do (
  22.     call set num=%%num:%%i=!n!%%
  23.     set /a n+=1
  24. )
  25. if %2 equ 1 set num=%num:十=10%
  26. if %2 equ 2 (
  27.     set lastone=!num:~-1!
  28.     if "!lastone!"=="十" (set num=%num:十=0%) else (set num=%num:十=1%)
  29. )
  30. if %2 equ 3 set num=%num:十=%
  31. set num=000%num%
  32. set num=%num:~-3%
  33. endlocal&set %3=%num%&goto :eof
复制代码
可以处理 “三位数” 以下的,比如第九十九章,替换成099章
仅修改章节处的数字,比如 第十三章 七个小矮人 第十节 一把魔镜.avi,替换成 第013章 七个小矮人 第010节 一把魔镜.avi
若只需要保留两位数,把倒数第二行代码中-3改为-2
作者: zghwelcome    时间: 2017-6-23 10:57

本帖最后由 zghwelcome 于 2017-6-23 10:59 编辑

学习了,写的很秒!
转换好像稍有问题
实测:第九十九章 XXXXXXXX 第二十二节 XXXXX.avi
         第909章 XXXXXXXX 第202节 XXXXX.avi

if %2 equ 3 set num=%num:十=0%   调整为  if %2 equ 3 set num=%num:十=%  后正常
作者: taofan712    时间: 2017-6-23 12:41

回复 4# zghwelcome


    感谢提醒,三位数确实应该把十替换为空,之前不知道怎么弄错了。

刚好还想到另外一个问题,两位数的中文数字还应该判断‘十’在个位还是在十位上,如二十和十二分别替换为0或1.
作者: happy886rr    时间: 2017-6-23 16:21

本帖最后由 happy886rr 于 2017-6-23 17:38 编辑

凑个热闹
  1. @echo off
  2. REM 开启变量延迟
  3. setlocal enabledelayedexpansion
  4. REM 构建基表
  5. set "hSTRING=零一二三四五六七八九"
  6. REM 构建0~99的汉字数字转换表
  7. for /l %%a in (0,1,9) do (
  8. for /l %%b in (0,1,9) do (
  9. if %%b equ 0 (
  10. set "____!hSTRING:~%%a,1!十=%%a0"
  11. ) else if %%a equ 0 (
  12. set "____!hSTRING:~%%b,1!=0%%b"
  13. ) else if %%a equ 1 (
  14. set "____十!hSTRING:~%%b,1!=1%%b"
  15. ) else if %%a gtr 1 (
  16. set "____!hSTRING:~%%a,1!十!hSTRING:~%%b,1!=%%a%%b"
  17. )
  18. )
  19. )
  20. REM 遍历子目录
  21. for /r %%a in (*.avi) do (
  22. REM 获取章节
  23.         for /f "tokens=1,2,3* delims=第章节" %%A in ("%%~nxa") do (
  24. REM 将章节转化为数码
  25. set "chapterNUM=!____%%A!"
  26. set "sectionNUM=!____%%C!"
  27. REM 真的纯数字直接凑齐两位
  28. if not defined chapterNUM (
  29. if "%%A"=="十" (
  30. set/a "chapterNUM=10"
  31. ) else (
  32. set/a "chapterNUM=100+%%A"
  33. )
  34. )
  35. if not defined sectionNUM (
  36. if "%%C"=="十" (
  37. set/a "sectionNUM=10"
  38. ) else (
  39. set/a "sectionNUM=100+%%C"
  40. )
  41. )
  42. echo 正在重命名...   "%%~nxa"
  43. ren "%%a" "第!chapterNUM:~-2!章%%B第!sectionNUM:~-2!节%%D"
  44.         )
  45. )
  46. REM 更名完毕
  47. pause
复制代码

作者: taofan712    时间: 2017-6-23 17:32

回复 6# happy886rr


    代码精练! 有个小瑕疵,如  "第十章"
作者: happy886rr    时间: 2017-6-23 17:40

本帖最后由 happy886rr 于 2017-6-23 17:50 编辑

回复 7# taofan712

好说,已改。你的for内部调用call会减慢速度。不过ren本身就是外部exe,更会拖慢速度。这个批怎么写都慢速。看来还得用gawk的改造版: gawkren.exe去瞬间更名。
对了,你的代码缺少注释,至少也得标明下每块是做啥的,便于他人查阅了解思路。
打表快,以空间换时间,你需要尽量避免for中大量call,call的解释机制会重载脚本,增加读取开销。




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