Board logo

标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理? [打印本页]

作者: irene6851     时间: 2009-4-29 01:23    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
<img src="images/smilies/face-sad.png" align="absmiddle" border="0"> 100,000多份.pdf 需重新命名, 向各位大侠求助!

原.pdf文件名为10位数字+5位英文字母, 例如: 1234567890ABCDE.pdf ;

对应的.txt内容是 数字+中文+数字, 例如: 0.0.0 掌上明珠 1-234-56-7890 ;

以上可以发现10位数字的内容是一一对应的, 只是有无"-"符号.

如何将 "1234567890ABCDE.pdf" 更换成 "0.0.0_1-234-56-7890_掌上明珠.pdf".

希望能批量处理这个难题!谢谢!


MSN: irene6851sun@hotmail.com

Last edited by irene6851 on 2009-4-30 at 10:20 ]

作者: freeants001     时间: 2009-4-29 01:54
发现有点问题~~

ren ??????????????.pdf ?-???-??-????_掌上明珠.pdf
for /r %%i in (*_掌上明珠.pdf) do ren %%~nxi 0.0.0_%%~nxi


Last edited by freeants001 on 2009-4-29 at 02:00 ]

作者: irene6851     时间: 2009-4-29 02:11    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
原.pdf文件名的数字和英文都各不相同, 而且, 对应的.txt内容是也是每个都不同的. 分别如下:
.pdf 文件名 .txt对应内容
2345678901ABEDC. pdf <---> 2.3.4 无巧不成书 2-345-67-8901
3456789012BAECD. pdf <---> 4.5.6 一言难尽的鸟 3-456-78-9012
....
.txt里面的内容不重复, 方式类似书籍的"章节", 没有一定的规律可寻. 只有末尾数字与.pdf原文件名重复.

根据网友提问补充:
.txt里面的内容格式, 大概是下面这个样子的.
2.3.4 无巧不成书 2-345-67-8901
4.5.6 一言难尽的鸟 3-456-78-9012
前三位数字是顶格的, 如果不是的, 我自己会调整成顶格的.
中间有一个空格, 然后是中文, 再空格, 然后是数字(中间有"-" )

最后重新改好的文件名的格式如下:
0.0.0_1-234-56-7890_掌上明珠.pdf
(顶格)数字 下划线 数字(中间有"-" ) 下划线 中文.pdf

Last edited by irene6851 on 2009-4-30 at 01:09 ]

作者: freeants001     时间: 2009-4-29 02:16
2345678901ABEDC. pdf <---> 2.3.4 无巧不成书 2-345-67-8901
3456789012BAECD. pdf <--> 4.5.6 一言难尽的鸟 3-456-78-9012
红色的部分是不是写错了,应该是3.4.5

作者: freeants001     时间: 2009-4-29 02:25
理解错了,想复杂了

作者: irene6851     时间: 2009-4-29 02:25    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
测试结果:
1. 8楼 代码基本达到要求. 只是文件格式和想要的不太一样.
想要的格式如下:
0.0.0_1-234-56-7890_掌上明珠.pdf
(顶格)数字 下划线 数字(中间有"-" ) 下划线 中文.pdf

2. 10楼 测试上面的几个范例很OK, 但是测试实际文件时, 文件名没有改变. 提示是"按任意键继续".

3. 9楼 测试实际文件时, 文件名没有改变. 提示是"按任意键继续".

请各位大侠看看有没有可能改进一下代码?

特别感谢8楼, 9楼, 10楼的三个大侠的帮助, 减轻了我的心理障碍, 因为公司的高级MIS一直肯定的告诉我, 你的想法根本就是不可能的!

Last edited by irene6851 on 2009-4-30 at 03:15 ]

作者: 26933062     时间: 2009-4-29 02:27
看错题了,你说的是某个txt文件中的内容?
比如 2.3.4 无巧不成书 2-345-67-8901 这其中的 2.3.4 是顶格写的吗?还是有空格在前面?

Last edited by 26933062 on 2009-4-29 at 02:43 ]

作者: freeants001     时间: 2009-4-29 02:41
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (t.txt) do (
set "mmm=%%~nxi"
set mmm=!mmm:-=!
set mmm=!mmm:~-10!
ren "!mmm!*.pdf" "%%~nxi.pdf"
)
pause

作者: 26933062     时间: 2009-4-29 03:18
十万个,还是创建一个临时文件速度快些,确定当前目录没有 tem 文件。
txt 文件为 a.txt 临时文件为 tem
未测试,测试前先备份原文件。。。。。。。

@echo off&setlocal enabledelayedexpansion
findstr /be "\.\..**-*-*-*" a.txt>tem
for /f "tokens=1-3 delims= " %%a in (tem) do (
set num=%%c&set "num=!num:-=!"
ren "!num!?????.pdf" "%%a_%%c_%%b.pdf"
)
del /q tem
pause

作者: netbenton     时间: 2009-4-29 07:49
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (a.txt) do (
set "str=%%c
set str=!str:-=!
ren "!str!*.*" "%%a_%%c_%%b.pdf"
)
pause


附件为测试用的

Last edited by netbenton on 2009-4-30 at 00:23 ]

作者: irene6851     时间: 2009-4-30 04:05    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
测试结果:

测试结果:
1. 8楼 代码基本达到要求. 只是文件格式和想要的不太一样.
想要的格式如下:
0.0.0_1-234-56-7890_掌上明珠.pdf
(顶格)数字 下划线 数字(中间有"-" ) 下划线 中文.pdf

2. 10楼 测试上面的几个范例很OK, 但是测试实际文件时, 文件名没有改变. 提示是"按任意键继续".

3. 9楼 测试实际文件时, 文件名没有改变. 提示是"按任意键继续".

请各位大侠看看有没有可能改进一下代码?

作者: freeants001     时间: 2009-4-30 04:26
这样应该可以了

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-3" %%i in (t.txt) do (
  4. set "mmm=%%~nxk"
  5. set mmm=!mmm:-=!
  6. set mmm=!mmm:~-10!
  7. ren "!mmm!*.pdf" "%%i_%%j_!mmm!.pdf"
  8. )
  9. pause

作者: irene6851     时间: 2009-4-30 04:57    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
12楼测试结果是"系统找不到指定的文件."

桌面test文件夹里t.txt, tt.bat 和.pdf.

作者: freeants001     时间: 2009-4-30 05:37
2.3.4 无巧不成书 2-345-67-8901

是不是你的txt文件中类似上面红色部份的结构中含有空格??

作者: tireless     时间: 2009-4-30 06:06
@echo off
for /f "tokens=1-6 delims=- " %%1 in (a.txt) do (
ren %%3%%4%%5%%6?????.pdf %%1_%%3-%%4-%%5-%%6_%%2.pdf
)

注:中文不能含空格、连接符“-”只能有三个。

Last edited by tireless on 2009-4-30 at 06:08 ]

作者: irene6851     时间: 2009-4-30 06:18    标题: 难题求助!用.txt内容重新命名对应.pdf文件,可否批量处理?
回复14楼freeants001:
.txt里面部分内容, 格式如下:
前面三个数字之间有.然后空格,再产品描述(中文; 英文字之间有空格),然后空格再接10位数字.

4.1.1 接通机器KF, FL, KL, VF 9-082-41-1071
4.1.1 启动机床PC 22 9-082-41-1091
4.2.8 显示输入单元PC 2x - 5x - 8x IPC 5.4.0.0 - IPC 5.5.0.0 9-082-42-8110
4.3.1 schuler 机床数据采集系统BASIC 9-082-43-1002
4.7.2 PC 22开始菜单 9-082-47-2011

作者: irene6851     时间: 2009-4-30 06:20
回复15楼tireless

测试代码, 不能更改文件名.

谢谢!

作者: freeants001     时间: 2009-4-30 06:21
果然有空格~

作者: irene6851     时间: 2009-4-30 06:28
回复18楼freeants001: 试.txt将全部空格去掉,得到以下内容:
4.1.1接通机器KF,FL,KL,VF9-082-41-1071
4.1.1启动机床PC229-082-41-1091
4.2.8显示输入单元PC2x-5x-8xIPC5.4.0.0-IPC5.5.0.09-082-42-8110
4.3.1schuler机床数据采集系统BASIC9-082-43-1002
4.7.2PC22开始菜单9-082-47-2011
测试结果, 系统找不到指定的文件.

谢谢!

作者: freeants001     时间: 2009-4-30 06:31
用这里http://www.cn-dos.net/forum/viewthread.php?tid=47244&fpage=12楼的的代码

把下面一行
sss=sss.replace(/^(\d.*\r\n)/gmi,"$1参考答案为\r\n");
替代成如下两行
sss=sss.replace(/^\s*(\d.\d.\d)\s*/gmi,"$1_");
sss=sss.replace(/\s*(\d-\d\d\d-\d\d-\d\d\d\d)\s*$/gmi,"_$1");


然后用这个脚本处理下你的哪个txt文件.

再用这里的8楼的代码就可以了.

Last edited by freeants001 on 2009-4-30 at 06:37 ]

作者: irene6851     时间: 2009-4-30 06:40
回复20楼 freeants001: 真的很感谢您的回复!

我现在手动去掉了.txt将全部空格去掉,得到以下内容:
4.1.1接通机器KF,FL,KL,VF9-082-41-1071
4.1.1启动机床PC229-082-41-1091
4.2.8显示输入单元PC2x-5x-8xIPC5.4.0.0-IPC5.5.0.09-082-42-8110
4.3.1schuler机床数据采集系统BASIC9-082-43-1002
4.7.2PC22开始菜单9-082-47-2011
测试结果, 系统找不到指定的文件.

麻烦看下是为什么?

作者: 26933062     时间: 2009-4-30 06:46
用ren 加 通配符 陷阱太多,还是换种思路吧,
如果你的 数字+字母 的pdf 文件,数字顺序都是不重复的,且数字的位数都是一样多,可以试试下面的代码。
注意先备份源文件。。。

@echo off&setlocal enabledelayedexpansion
findstr /be "\.\..**-*-*-*" a.txt>tem
for /f "tokens=1-3 delims= " %%a in (tem) do (
set num=%%c&set "num=!num:-=!"
for %%i in (!num!*.pdf)do ren "%%i" "%%a_%%c_%%b.pdf"
)
del /q tem
pause

作者: tireless     时间: 2009-4-30 06:46
如果满足以下三个条件:

1、文本中每行的末尾不能有空格;
2、文本中不能含有英文感叹号;
3、末尾的数字必须是 9(一位)-082(三位)-41(两位)-1071(四位);


@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (a.txt) do (
set var=%%a
ren "!var:~-13,1!!var:~-11,3!!var:~-7,2!!var:~-4!?????.pdf" "!var:~,5!_!var:~-13!_!var:~6,-14!.pdf"
)


Last edited by tireless on 2009-4-30 at 06:53 ]

作者: 26933062     时间: 2009-4-30 06:50
晕,22楼是按你顶楼要求写的,你去掉空格就不行了。。

作者: freeants001     时间: 2009-4-30 06:51
Originally posted by irene6851 at 2009-4-30 06:40:
回复20楼 freeants001: 真的很感谢您的回复!

我现在手动去掉了.txt将全部空格去掉,得到以下内容:
4.1.1接通机器KF,FL,KL,VF9-082-41-1071
4.1.1启动机床PC229-082 ...


手动去掉了.txt将全部空格,直接用8楼的代码就可以了.

作者: freeants001     时间: 2009-4-30 06:54
20楼的方法可以不用去空格,
txt文件每行头尾和中间可有任意空格

作者: irene6851     时间: 2009-4-30 06:57
回复22楼26933062 : 感谢您的回复!

测试结果比较有意思, 有一个文件名被改了, 另外四个没有.
提示: 有文件重复......

Last edited by irene6851 on 2009-4-30 at 07:00 ]

作者: irene6851     时间: 2009-4-30 07:07
回复23楼tireless: 感谢您的帮助.

测试结果, 完全符合想要的要求.
也不知道有没有按那三点要求做,
1. .txt里面的内容文字中间有空格,但是末尾没有.
2. 里面应该没有感叹号.
3. 结尾大多数是如 0-000-00-0000的结构.

十分感谢!

作者: netbenton     时间: 2009-4-30 07:07
re 楼主
按你给出范例的已经解决了,
实际还不行,那肯定是你给出的范例不具代表性。

要解决问题还是把你的.txt内容多发一点上来,

执行:
dir /b *.pdf>dir.txt

再把dir.txt 的内容也发上来看看。

作者: irene6851     时间: 2009-4-30 10:27
回复29楼netbenton, 可能是举例有点简单了, 不好意思!

上传了数个.pdf文件, .txt文件, 打包后的文件夹在论坛里, 原名称是 test.rar, 上传后名称是“1452.rar”。

烦请看看!

作者: tireless     时间: 2009-4-30 11:58    标题: Re 30楼
你上传的附件中的 a.txt 里面每行末尾都有一个空格,如果实际是这样的话,把 23 楼的改成:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (a.txt) do (
set var=%%a
ren "!var:~-14,1!!var:~-12,3!!var:~-8,2!!var:~-5,4!?????.pdf" "!var:~,5!_!var:~-14,-1!_!var:~6,-15!.pdf"
)


另,4.2.8 显示输入单元PC 2x / 5x / 8x IPC 5.4.0.0 / IPC 5.5.0.0 9-082-42-8110,其中的 / 不能作为文件名,要手工把文本中的 / 替换掉,或者把代码中的 set var=%%a 改成 set var=%%a&set var=!var:/=/!

Last edited by tireless on 2009-4-30 at 12:07 ]

作者: netbenton     时间: 2009-4-30 12:28
楼主上传的内容是想得到什么结果,最好能一并说明,才好解决

如果想改成这样一个文件名:
4.2.8 显示输入单元PC 2x / 5x / 8x IPC 5.4.0.0 / IPC 5.5.0.0 9-082-42-8110
那是不可能的。

作者: 26933062     时间: 2009-4-30 13:44
估计他的pdf文件名应该有 “10位数字相同加不同的5位字母” 的格式,
比如 1234567890abcd.pdf 和 1234567890efghi.pdf
那么用ren 数字????? 的方式应该是完不成的。
关键是有10万个,必须考虑效率问题啊。
另外楼主的txt文件内容和pdf文件是一一相对的吗?没有多余的行?
还有你们是怎么下载的附件啊?
楼主在11楼说问题解决,16楼又给出了新的样本?
新样本中需要按怎样的格式重命名文件呢?

作者: irene6851     时间: 2009-4-30 22:51
回复31-32楼的朋友们:今天是五一节, 没想到你们都在!真是很意外!

回复31楼tireless: 谢谢您的建议,“/”符号和空格可以手动去掉。现在您的两个方案, 我都保留,不断用新的内容会去测试。 十分感谢!

回复32楼netbenton: 测试过10楼您自己打包的文件,全部文件改名都OK。 但是, 测试我要的文件时, 出现问题。所以,我在30楼说,将我要的文件打包上传, 想请您和各位也可实际测试一下代码的效果。 符号/的问题,我会注意去掉的。谢谢哦!

回复32楼netbenton:
回复33楼26933062:
重新命名的文件名格式是: 数字.数字.数字_(下划线)一位数字-三位数字-两位数字-四位数字_(下划线)文字描述(只有中文;有中文和英文;有中文和英文和数字三种情况).pdf
例如: 0.0.0_1-234-56-7890_掌上明珠.pdf

txt文件内容和pdf文件是一一相对,没有多余的行,和上传打包里面的的a.txt是一样的。如下:
4.1.1 接通机器KF,FL,KL,VF 9-082-41-1071
4.1.1 启动机床PC22 9-082-41-1091
4.2.8 显示输入单元PC2x / 5x / 8x IPC5.4.0.0 / IPC5.5.0.0 9-082-42-8110
4.3.1 schuler机床数据采集系统BASIC 9-082-43-1002
4.7.2 PC22开始菜单 9-082-47-2011
第三行里面的“/”没有手动去掉, 是想保持一个“原生态”给各位参考一下。

11楼讲的是测试结果。目前测试过,达到想要效果的有23楼的代码,8楼的代码文件名的顺序有点不一样。从31楼开始的代码会稍后再测。

Last edited by irene6851 on 2009-4-30 at 23:35 ]

作者: tireless     时间: 2009-4-30 23:03    标题: Re 34 楼
你上传的 1452.rar 里面的 a.txt 每行末尾确实有一个空格。

作者: irene6851     时间: 2009-4-30 23:18
O...又查了一次, 的确有空格,不好意思!

删除那一句。

Last edited by irene6851 on 2009-4-30 at 23:24 ]

作者: freeants001     时间: 2009-5-1 00:14
1.复制下面代码,保存为re.js到a.txt所在目录运行.
2.运行生成的js.bat.
srcfl="a.txt"
fso=new ActiveXObject("scripting.filesystemobject")
sss=fso.opentextfile(srcfl,1).readall();
sss=sss.replace(/\\/g,"\");
sss=sss.replace(/\//g,"/");
sss=sss.replace(/:/g,":");
sss=sss.replace(/\*/g,"*");
sss=sss.replace(/</g,"〈");
sss=sss.replace(/>/g,"〉");
sss=sss.replace(/\|/g,"|");
sss=sss.replace(/^\s*(\d.\d.\d)\s*(\S.*\S)\s*(\d)\s*-\s*(\d\d\d)\s*-\s*(\d\d)\s*-\s*(\d\d\d\d)\s*$/gmi,"ren \"$3$4$5$6*.pdf\" \"$1_$3$4$5$6_$2.pdf\"\r\n")
fso.createtextfile("js.bat").write(sss)

注:
1.a.txt中的文件名可以是以下形式(处理后文件名为"4.1.1_9082411071_接通机器KF, FL, KL, VF.pdf")
     "  4.1.1 接通机器KF, FL, KL, VF 9-082-41-1071   "
     "4.1.1 接通机器KF, FL, KL, VF 9 - 082 - 41 - 1071 "
     "4.1.1接通机器KF, FL, KL, VF 9-082- 41- 1071 "
     "4.1.1接通机器KF, FL, KL, VF9-082-41 -1071 "


2.如果a.txt中含有\/:*?"<>等非法字符,脚本将自动替换成对应的中文符号

Last edited by freeants001 on 2009-5-1 at 01:45 ]

作者: 26933062     时间: 2009-5-1 05:13
就你给的样本文件,测试是成功的。但需删除每行末尾的空格。
txt中的 / 符号不是合法的文件名,代码中自动将其替换为#号。
还是那句话,所有pdf文件中,不能有10位数字顺序一样的情况
比如:1234567890abcde.pdf 和 1234567890efghi.pdf
数字部分完全一样,只有字母不同,就不行。

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims= " %%a in (a.txt) do (
for /f "tokens=1* delims=-" %%i in ("%%b") do (
set var=%%i&set "var2=%%j"&set "var=!var:/=#!"
set "num=!var:~-1!!var2:-=!"
ren "!num!?????.pdf" "%%a_!var:~-1!-!var2!_!var:~0,-2!.pdf"
))
pause

作者: terse     时间: 2009-5-1 07:23
这样呢?

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1*" %%a in (a.txt) do (
set "str=%%b"
set "var=%%~nb"
set var=!var:~-13!
set "str=!str:~,-15!"
echo ren "!var:-=!?????.pdf" "%%a_!var! _!str:/=#!.pdf"
)
pause