标题:求教:如何批量将文件名当中的汉字数字替换为统一宽度阿拉伯数字(001、002 ...
取消只看楼主
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
结帖率:100%
 问题点数:0 回复次数:5 
求教:如何批量将文件名当中的汉字数字替换为统一宽度阿拉伯数字(001、002……127、128)
下载了一些有声书,打算拷贝到手机听听,类似这样子:
--------------------------
【有声剧】第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀.m4a
【有声剧】第二回 贾夫人仙逝扬州城 冷子兴演说荣国府.m4a
……
【有声剧】第六十五回 贾二舍偷娶尤二姨 尤三姐思嫁柳二郎.m4a
……
【有声剧】第一百十七回 阻超凡佳人双护玉 欣聚党恶子独承家.m4a
……
--------------------------

傻瓜都知道,这样子听可要乱套!
必须改名为:
--------------------------
001回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀.m4a
002回 贾夫人仙逝扬州城 冷子兴演说荣国府.m4a
……
065回 贾二舍偷娶尤二姨 尤三姐思嫁柳二郎.m4a
……
117回 阻超凡佳人双护玉 欣聚党恶子独承家.m4a
……
--------------------------

网上找到一段BAT代码,可惜是100以内的,不太清楚DOS批处理的语法,不太会改,怎么破?

rem ---------------------------------------
rem 批量将文件中汉字数字替换为阿拉伯数字
@echo off
for /f  "delims=" %%i in ('dir /b') do call :Replacement "%%i"
exit
:Replacement
set t1=%~1
set t1=%t1:九十=90%
set t1=%t1:八十=80%
set t1=%t1:七十=70%
set t1=%t1:六十=60%
set t1=%t1:五十=50%
set t1=%t1:四十=40%
set t1=%t1:三十=30%
set t1=%t1:二十=20%
set t1=%t1:十一=11%
set t1=%t1:十二=12%
set t1=%t1:十三=13%
set t1=%t1:十四=14%
set t1=%t1:十五=15%
set t1=%t1:十六=16%
set t1=%t1:十七=17%
set t1=%t1:十八=18%
set t1=%t1:十九=19%
set t1=%t1:十=10%
set t1=%t1:九=9%
set t1=%t1:八=8%
set t1=%t1:七=7%
set t1=%t1:六=6%
set t1=%t1:五=5%
set t1=%t1:四=4%
set t1=%t1:三=3%
set t1=%t1:二=2%
set t1=%t1:一=1%
set t1=%t1:零=0%
set t1=%t1:09=9%
set t1=%t1:08=8%
set t1=%t1:07=7%
set t1=%t1:06=6%
set t1=%t1:05=5%
set t1=%t1:04=4%
set t1=%t1:03=3%
set t1=%t1:02=2%
set t1=%t1:01=1%
echo %t1%
ren %1 "%t1%"
goto :eof
rem ---------------------------------------

此外,本版还有厨师大侠的一段VBA代码,不过他心思缜密,搞得相当复杂、面面俱到,篇幅太长啦,翻译起来也比较困难,呵呵:
https://bbs.bccn.net/thread-498554-1-1.html
搜索更多相关主题的帖子: 数字 set 字数 替换 批量 
2022-11-02 15:59
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
因不想编复杂程序去解决单一问题,那纯属浪费脑筋。
先dir成文本,再用正则过滤了一下,并自动排序了一下,得到了1---120的中文数字列表。
稍后再分析一下,能否倒逼出一个相对优雅的算法来:
----------------










一百
七十
三十
九十
二十
五十
八十
六十
十一
十七
十三
十九
十二
十五
十八
十六
十四
四十
一百十
七十一
七十七
七十三
七十九
七十二
七十五
七十八
七十六
七十四
三十一
三十七
三十三
三十九
三十二
三十五
三十八
三十六
三十四
九十一
九十七
九十三
九十九
九十二
九十五
九十八
九十六
九十四
二十一
二十七
二十三
二十九
二十二
二十五
二十八
二十六
二十四
五十一
五十七
五十三
五十九
五十二
五十五
五十八
五十六
五十四
八十一
八十七
八十三
八十九
八十二
八十五
八十八
八十六
八十四
六十一
六十七
六十三
六十九
六十二
六十五
六十八
六十六
六十四
四十一
四十七
四十三
四十九
四十二
四十五
四十八
四十六
四十四
一百二十
一百十一
一百十七
一百十三
一百十九
一百十二
一百十五
一百十八
一百十六
一百十四
一百零一
一百零七
一百零三
一百零九
一百零二
一百零五
一百零八
一百零六
一百零四
------------

似乎只有3个例外,需直接查表转:“十”、“一百”和“一百十”。
其他的都符合转换规律:
lenc(x)=4字:“百”字删除;
lenc(x)=3字:“十”在中间删除,在末尾转成“0”;
lenc(x)=2字:“十”在左为“1”,在右为“0”;
lenc(x)=1字:直接查表转,“十”在例外字时已处理,转为“10”。

不知有没有更科学的转换规律?
2022-11-03 11:56
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
再百度了一下,原来excel自带“阿拉伯数字转中文数字”功能,那就比较简单啦——
我要的其实也可以只是一张完整的1---120共120行的Num2Chn转换表。
不一定非要正向转换Num2Chn,反向转换Chn2Num其实也一样的,目标都相同:
只要得到一张120行的转换表!

直接用excel阿拉伯数字转中文数字,得到转换表;
稍稍编辑一下与源文件名有差异的地方;
然后逐一查表转换120个文件名即可。

至于其他细节,没必要去深究,也没必要搞得那么复杂!
嘿嘿。
2022-11-03 12:56
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
楼主的目标有些“恶趣味”:
在自己不主动编写代码(注:允许修改套用一下他人的现成代码)之前提下,解决顶楼的文件改名的问题!

好吧,这就是终极解决方案:

1、利用excel现成功能,得到“阿拉伯数字转中文数字”的自动转换表;
2、微调此转换表,只要2个替换:“一十 ==> 十”,“○ ==> 零”;
3、利用正则表达式,替换此转换表至最终格式:
-----------
@echo off
for /f  "delims=" %%i in ('dir /b') do call :Replacement "%%i"
exit
:Replacement
set t1=%~1
set t1=%t1:【有声剧】第一百二十=120%
set t1=%t1:【有声剧】第一百十九=119%
set t1=%t1:【有声剧】第一百十八=118%
set t1=%t1:【有声剧】第一百十七=117%
set t1=%t1:【有声剧】第一百十六=116%
set t1=%t1:【有声剧】第一百十五=115%
set t1=%t1:【有声剧】第一百十四=114%
set t1=%t1:【有声剧】第一百十三=113%
set t1=%t1:【有声剧】第一百十二=112%
set t1=%t1:【有声剧】第一百十一=111%
set t1=%t1:【有声剧】第一百十=110%
set t1=%t1:【有声剧】第一百零九=109%
set t1=%t1:【有声剧】第一百零八=108%
set t1=%t1:【有声剧】第一百零七=107%
set t1=%t1:【有声剧】第一百零六=106%
set t1=%t1:【有声剧】第一百零五=105%
set t1=%t1:【有声剧】第一百零四=104%
set t1=%t1:【有声剧】第一百零三=103%
set t1=%t1:【有声剧】第一百零二=102%
set t1=%t1:【有声剧】第一百零一=101%
set t1=%t1:【有声剧】第一百=100%
set t1=%t1:【有声剧】第九十九=099%
set t1=%t1:【有声剧】第九十八=098%
set t1=%t1:【有声剧】第九十七=097%
set t1=%t1:【有声剧】第九十六=096%
set t1=%t1:【有声剧】第九十五=095%
set t1=%t1:【有声剧】第九十四=094%
set t1=%t1:【有声剧】第九十三=093%
set t1=%t1:【有声剧】第九十二=092%
set t1=%t1:【有声剧】第九十一=091%
set t1=%t1:【有声剧】第九十=090%
set t1=%t1:【有声剧】第八十九=089%
set t1=%t1:【有声剧】第八十八=088%
set t1=%t1:【有声剧】第八十七=087%
set t1=%t1:【有声剧】第八十六=086%
set t1=%t1:【有声剧】第八十五=085%
set t1=%t1:【有声剧】第八十四=084%
set t1=%t1:【有声剧】第八十三=083%
set t1=%t1:【有声剧】第八十二=082%
set t1=%t1:【有声剧】第八十一=081%
set t1=%t1:【有声剧】第八十=080%
set t1=%t1:【有声剧】第七十九=079%
set t1=%t1:【有声剧】第七十八=078%
set t1=%t1:【有声剧】第七十七=077%
set t1=%t1:【有声剧】第七十六=076%
set t1=%t1:【有声剧】第七十五=075%
set t1=%t1:【有声剧】第七十四=074%
set t1=%t1:【有声剧】第七十三=073%
set t1=%t1:【有声剧】第七十二=072%
set t1=%t1:【有声剧】第七十一=071%
set t1=%t1:【有声剧】第七十=070%
set t1=%t1:【有声剧】第六十九=069%
set t1=%t1:【有声剧】第六十八=068%
set t1=%t1:【有声剧】第六十七=067%
set t1=%t1:【有声剧】第六十六=066%
set t1=%t1:【有声剧】第六十五=065%
set t1=%t1:【有声剧】第六十四=064%
set t1=%t1:【有声剧】第六十三=063%
set t1=%t1:【有声剧】第六十二=062%
set t1=%t1:【有声剧】第六十一=061%
set t1=%t1:【有声剧】第六十=060%
set t1=%t1:【有声剧】第五十九=059%
set t1=%t1:【有声剧】第五十八=058%
set t1=%t1:【有声剧】第五十七=057%
set t1=%t1:【有声剧】第五十六=056%
set t1=%t1:【有声剧】第五十五=055%
set t1=%t1:【有声剧】第五十四=054%
set t1=%t1:【有声剧】第五十三=053%
set t1=%t1:【有声剧】第五十二=052%
set t1=%t1:【有声剧】第五十一=051%
set t1=%t1:【有声剧】第五十=050%
set t1=%t1:【有声剧】第四十九=049%
set t1=%t1:【有声剧】第四十八=048%
set t1=%t1:【有声剧】第四十七=047%
set t1=%t1:【有声剧】第四十六=046%
set t1=%t1:【有声剧】第四十五=045%
set t1=%t1:【有声剧】第四十四=044%
set t1=%t1:【有声剧】第四十三=043%
set t1=%t1:【有声剧】第四十二=042%
set t1=%t1:【有声剧】第四十一=041%
set t1=%t1:【有声剧】第四十=040%
set t1=%t1:【有声剧】第三十九=039%
set t1=%t1:【有声剧】第三十八=038%
set t1=%t1:【有声剧】第三十七=037%
set t1=%t1:【有声剧】第三十六=036%
set t1=%t1:【有声剧】第三十五=035%
set t1=%t1:【有声剧】第三十四=034%
set t1=%t1:【有声剧】第三十三=033%
set t1=%t1:【有声剧】第三十二=032%
set t1=%t1:【有声剧】第三十一=031%
set t1=%t1:【有声剧】第三十=030%
set t1=%t1:【有声剧】第二十九=029%
set t1=%t1:【有声剧】第二十八=028%
set t1=%t1:【有声剧】第二十七=027%
set t1=%t1:【有声剧】第二十六=026%
set t1=%t1:【有声剧】第二十五=025%
set t1=%t1:【有声剧】第二十四=024%
set t1=%t1:【有声剧】第二十三=023%
set t1=%t1:【有声剧】第二十二=022%
set t1=%t1:【有声剧】第二十一=021%
set t1=%t1:【有声剧】第二十=020%
set t1=%t1:【有声剧】第十九=019%
set t1=%t1:【有声剧】第十八=018%
set t1=%t1:【有声剧】第十七=017%
set t1=%t1:【有声剧】第十六=016%
set t1=%t1:【有声剧】第十五=015%
set t1=%t1:【有声剧】第十四=014%
set t1=%t1:【有声剧】第十三=013%
set t1=%t1:【有声剧】第十二=012%
set t1=%t1:【有声剧】第十一=011%
set t1=%t1:【有声剧】第十=010%
set t1=%t1:【有声剧】第九=009%
set t1=%t1:【有声剧】第八=008%
set t1=%t1:【有声剧】第七=007%
set t1=%t1:【有声剧】第六=006%
set t1=%t1:【有声剧】第五=005%
set t1=%t1:【有声剧】第四=004%
set t1=%t1:【有声剧】第三=003%
set t1=%t1:【有声剧】第二=002%
set t1=%t1:【有声剧】第一=001%
echo %t1%
ren %1 "%t1%"
goto :eof
-----------

Bingo! 毫无疑问地,成功啦!
鬼叫楼主如此冰雪聪明,玉树临风。
2022-11-03 14:46
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
非常感谢fyyylyl的帮助!

先前楼主偷懒,不想写代码,实因若真的要写话,就不得不考虑函数的通用性。
那就要像厨师版主那样,方方面面都得照顾到。

比方说,数值的最大范围,恐怕要到“亿”,甚至“千亿”;
又比方说,还得考虑输入参数的规范、不规范的容错问题:“一百零二”与“一百○二”,甚至“壹佰二十叁”,也要进行容错处理。
总之,一旦决定写代码,那就会是一个不大不小的工程了。

故而,大事化小,小事化了,息事宁人最善!
不战而屈人之兵,是为上战者也。


以下是引用fyyylyl在2022-11-4 10:14:16的发言:

既然在这儿提问,就用VFP实现:

WorkPath=GETDIR("","","请选择文件夹:")
IF !EMPTY(WorkPath)
    nFiles=Adir(MyArray,WorkPath+'*.m4a')
    IF nFiles>0
        FOR j=1 TO nFiles
            RENAME (WorkPath+MyArray(j,1)) TO  (WorkPath+cNum2aNum(MyArray(j,1)))
        ENDFOR
    ENDIF
ENDIF


FUNCTION cNum2aNum
PARAMETERS c_Num
c_Num0=c_Num
c_Num=SUBSTR(ALLTRIM(c_Num),3,ATC('回',c_Num)-ATC('第',c_Num)-2)
c_Num1=c_Num
c_Num=IIF(LEFT(STRTRAN(c_Num,'百十','百一十'),2)='十','一','')+STRTRAN(c_Num,'百十','百一十')
    cUnit='十百'
FOR i=1 TO LEN(cUnit)/2
    IF  RIGHT(ALLTRIM(c_Num),2)=SUBSTR(cUnit,(i-1)*2+1,2)
        c_Num=ALLTRIM(c_Num)+REPLICATE('零',i)
    ENDIF
ENDFOR
c_Num=PADL(ALLTRIM(CHRTRANC(c_Num, '一二三四五六七八九零百十', '1234567890')),3,'0')
c_Num=STRTRAN(c_Num0,c_Num1,c_Num)
RETURN c_Num

2022-11-04 13:21
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
哇靠!这个函数狠强大!狠巧妙!
吹版一出手,就知有没有哇!!!


以下是引用吹水佬在2022-11-5 20:37:44的发言:
FUNCTION NumConver(cNum)
    n = 1
    m = 0
    FOR i=LENC(cNum) TO 1 STEP -1
        ccc = SUBSTRC(cNum,i,1)
        num = ASCAN(arr1, ccc)
        IF num != 0
            m = m + n*(num-1)
        ELSE
            n = 10^ASCAN(arr2,ccc)
        ENDIF
    ENDFOR
    RETURN INT(m)
ENDFUNC

2022-11-05 23:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510512-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.237297 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved