Board logo

标题: [文本处理] 读取文件名按特定的格式输出至文本中! [打印本页]

作者: ganjie    时间: 2009-1-16 19:32     标题: 读取文件名按特定的格式输出至文本中!

求大大们帮忙写个批,小弟在此先谢谢了!假如某目录下有文件夹若干,如psp、nds、bbs等,它们里面都有一个word子目录,要求一一对应读取其文件名,然后按6个为一组保存到文本中,假设psp下有文件doc01、doc02、doc03、……,其子目录word下有文件word01、word02、word03……,输出格式如下:注意红色的部分!

psp01.txt
<p>
<a doc01 1><word/word01>
<a doc02 2><word/word02>
<a doc03 3><word/word03>
<a doc04 4><word/word04>
<a doc05 5><word/word05>
<a doc06 6><word/word06>
<p>
<p>doc01<P>

psp02.txt
<p>
<a doc07 1><word/word07>
<a doc08 2><word/word08>
<a doc09 3><word/word09>
<a doc10 4><word/word10>
<a do011 5><word/word11>
<a doc12 6><word/word12>
<p>
<p>doc07<P>

psp03.txt
<p>
<a doc13 1><word/word13>
<a doc14 2><word/word14>
<a doc15 3><word/word15>
<a doc16 4><word/word16>
<a do017 5><word/word17>
<a doc18 6><word/word18>
<p>
<p>doc13<P>
作者: dig    时间: 2009-1-16 20:50

  psp目录下的doc文件名和word子目录下的word文件名是一一对应的吗?doc01之类的文件名是不是“doc+两位数字”的格式?
作者: ganjie    时间: 2009-1-16 21:03

偶说的一一对应是,先读一个psp里的内容,再读word里的,然后psp里,再word,如
<a doc01 1><word/word01>
<a doc02 2><word/word02>
<a doc03 3><word/word03>
作者: namejm    时间: 2009-1-19 09:50

  “先读psp的内容,再读word里的,……”,你这样的描述太模糊了,至少你没有交代读文件的时候是否需要按某种顺序获取文件名,这是至关重要的,另外,如果不满6个又怎么处理?还有,doc01中那些数字的规律是什么,你并没有做任何说明。像楼主这样的描述,没有人能帮得了你——有谁愿意在帮你写代码之前,先花10多个帖子来询问各种细节呢?最好的办法是:请楼主在顶楼把所有可利用的条件一次性交代清楚,请注意,是一次性,而不是分多次。
作者: ganjie    时间: 2009-1-19 10:05

假设psp下有文件doc01、doc02、doc03、……,psp里的文件名是按文件名名称排序读取,doc01、doc02、doc03这些是假设文件名是这样,psp里的文件个数与其子目录word里文件的个数是相同的,如果不满6个则,如下:
如果最后还剩5个,则
<p>
<a doc61 1><word/word61>
<a doc62 2><word/word62>
<a doc63 3><word/word63>
<a doc64 4><word/word64>
<a doc65 5><word/word65>
<p>
<p>doc61<P>

如果最后剩4个,则
<p>
<a doc61 1><word/word61>
<a doc62 2><word/word62>
<a doc63 3><word/word63>
<a doc64 4><word/word64>
<p>
<p>doc61<P>
同理如果剩1个,则
<p>
<a doc61 1><word/word61>
<p>
<p>doc61<P>

[ 本帖最后由 ganjie 于 2009-1-19 10:12 编辑 ]
作者: namejm    时间: 2009-1-19 11:41

  doc01是不是和word01对应,而docN和wordN对应?(N表示数字)?N只有两位数字吗?另外,psp01.txt之类的文件名是不是有什么讲究?若楼主还需要别人继续追问才把所有可利用的条件及自己的准确意图极不情愿地一点一点地说完的话,那楼主就等更有耐心的人来解这个题吧。
作者: ganjie    时间: 2009-1-19 13:27

其实我就是单纯的,读取文件名,只不过是同时要读取两个目录,有文件就读取出来,没有文件就不读,仅是这样的,上面的docN不是和wordN对应的,psp里的文件是若干个未知名的文件,doc01(这个是为了好发贴而假设的文件名)这个的意思是psp里的文件按名称排序后的第一个文件名,word01是word里的文件按文件名排序后的第一个文件名,只是psp里的文件个数和其word里文件个数相同,psp01.txt的意思是,因为要读取多个目录,为了好分,就以每个文件夹名为标签再加上数字,因为是6个为一组,第二个则是psp02.txt,第三个则是psp03.txt,以此类推!
作者: namejm    时间: 2009-1-20 00:34

以下代码尚有纰漏,请勿用于正式场合。正确的代码在10楼。
______________________________________

  假设路径不存在空格、感叹号和&这些特殊字符,父目录下的文件为*.doc,子目录下的文件为*.word,那么,可以在当前文件夹下使用如下代码(为了提高效率,使用了临时文件;为了不重复处理,生成的txt文件放在当前文件根目录下的tmp文件夹中):
  1. @echo off
  2. set /a num=0
  3. setlocal enabledelayedexpansion
  4. set tmpdir=%~d0\tmp
  5. md %tmpdir% 2>nul
  6. for /f "delims=" %%i in ('dir /ad /b') do (
  7.     for /f "delims=" %%j in ('dir /a-d /b %%i\*.doc') do (
  8.         set /a num1=!num!%%6+1
  9.         if !num1! equ 1 set /a num2+=1
  10.         call :output %%i %%j !num!
  11.         set /a num+=1
  12.     )
  13. )
  14. del /a %tmpdir%\tmp>nul
  15. pause
  16. exit
  17. :output
  18. dir /a-d /b %1\word\*.word>%tmpdir%\tmp
  19. for /f "delims=" %%i in ('more +!num! %tmpdir%\tmp') do (
  20.     if !num1! equ 1 (
  21.         echo ^<p^>>%tmpdir%\%1!num2!.txt
  22.         set str=%2
  23.     )
  24.     if !num1! geq 1 (
  25.         echo ^<a %2 !num1!^>^<word/%%i^>>>%tmpdir%\%1!num2!.txt
  26.     )
  27.     if !num1! equ 6 (
  28.         echo ^<p^>>>%tmpdir%\%1!num2!.txt
  29.         echo ^<p^>!str!^<p^>>>%tmpdir%\%1!num2!.txt
  30.     )
  31.     goto :eof
  32. )
  33. goto :eof
复制代码
  测试环境使用如下代码构建,处理120个文件耗时19S左右,效率不是很高(WinXPSP3,Intel Pentium processor 1.60GHz,512MB内存,HPV2009AP笔记本):
  1. @echo off
  2. for %%i in (psp nds bbs) do (
  3.     md %%i 2>nul
  4.     md %%i\word 2>nul
  5.     for /l %%j in (1,1,20) do cd.>%%i\doc%%j.doc&cd.>%%i\word\word%%j.word
  6. )
复制代码

作者: ganjie    时间: 2009-1-20 08:10

  1. @echo off
  2. set /a num=0
  3. setlocal enabledelayedexpansion
  4. set tmpdir=%~d0\tmp
  5. md %tmpdir% 2>nul
  6. for /f "delims=" %%i in ('dir /ad /b') do (
  7. for /f "delims=" %%j in ('dir /a-d /b %%i\*.doc') do (
  8. set /a num1=!num!%%6+1
  9. if !num1! equ 1 set /a num2+=1
  10. call :output %%i %%j !num!
  11. set /a num+=1
  12. )
  13. )
  14. del /a %tmpdir%\tmp>nul
  15. pause
  16. exit
  17. :output
  18. dir /a-d /b %1\word\*.word>%tmpdir%\tmp
  19. for /f "delims=" %%i in ('more +!num! %tmpdir%\tmp') do (
  20. if !num1! equ 1 (
  21. echo ^>%tmpdir%\%1!num2!.txt
  22. set str=%2
  23. )
  24. if !num1! geq 1 (
  25. echo ^^>>%tmpdir%\%1!num2!.txt
  26. )
  27. if !num1! equ 6 (
  28. echo ^>>%tmpdir%\%1!num2!.txt
  29. echo ^!str!^>>%tmpdir%\%1!num2!.txt
  30. )
  31. goto :eof
  32. )
  33. goto :eof
复制代码

试测了,假设nds内有16个文件(doc21至doc36),其word内也有16个文件(word21至word36),,而psp内有17个文件(doc01至doc17),其word内有17个文件(word01至word17)则上面的代码生成的文件仅为为4个:nds1.txt、nds2.txt、nds3.txt、psp3.txt,生成的文本内容如下:
nds1.txt
<p>
<a doc21 1><word/word21>
<a doc22 2><word/word22>
<a doc23 3><word/word23>
<a doc24 4><word/word24>
<a doc25 5><word/word25>
<a doc26 6><word/word26>
<p>
<p>doc21<p>


nds2.txt
<p>
<a doc27 1><word/word27>
<a doc28 2><word/word28>
<a doc29 3><word/word29>
<a doc30 4><word/word30>
<a doc31 5><word/word31>
<a doc32 6><word/word32>
<p>
<p>doc27<p>

nds3.txt (从个这起就开始错了)
<p>
<a doc33 1><word/word33>
<a doc34 2><word/word34>
<a doc35 3><word/word35>
<a doc36 4><word/word36>

psp3.txt
<a doc01 5><word/word17>

还有生成的文本,不要保存在根目录下的tmp文件夹下,应保存在其对应的文件夹下,如psp01、psp02、……就保存在psp文件夹里,nds01、nds02、……就保存在nds文件夹里
作者: namejm    时间: 2009-1-20 19:14

  8楼代码为凌晨时草就,只搭了个大体的框架,代码没有做全面的修正,今天抽空把这个代码完善了一下,可以满足楼主在9楼的需求,请测试。

  需要注意的是,若要处理的文件类型是txt的话,保存的文件后缀名不能为txt,应换用其他的后缀名。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /ad /b') do (
  4.     set /a num=0,num2=0
  5.     for /f "delims=" %%j in ('dir /a-d /b %%i\*.doc') do (
  6.         set /a num1=!num!%%6+1
  7.         if !num1! equ 1 set /a num2+=1
  8.         call :output %%i %%j
  9.         set /a num+=1
  10.     )
  11.     set str1=%%i\%%i!num2!.txt
  12.     if !num1! neq 6 (
  13.         echo ^<p^>>>!str1!
  14.         echo ^<p^>!str!^<p^>>>!str1!
  15.     )
  16. )
  17. del /a "%tmp%\tmp">nul
  18. pause
  19. exit
  20. :output
  21. dir /a-d /b %1\word\*.word>"%tmp%\tmp"
  22. for /f "delims=" %%i in ('more +!num! "%tmp%\tmp"') do (
  23.     if !num1! equ 1 (
  24.         echo ^<p^>>%1\%1!num2!.txt
  25.         set str=%2
  26.     )
  27.     if !num1! geq 1 (
  28.         echo ^<a %2 !num1!^>^<word/%%i^>>>%1\%1!num2!.txt
  29.     )
  30.     if !num1! equ 6 (
  31.         echo ^<p^>>>%1\%1!num2!.txt
  32.         echo ^<p^>!str!^<p^>>>%1\%1!num2!.txt
  33.     )
  34.     goto :eof
  35. )
  36. goto :eof
复制代码

作者: terse    时间: 2009-1-21 02:29

也发个 貌似效率提点
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /ad /b') do (
  3.     set/a n=0,s=0,s2=0,n1=0
  4.        for /f "delims=" %%j in ('dir /b /a-d "%%i\*.doc"') do set/a n1+=1&set _!n1!=%%j
  5.           for /f "delims=" %%k in ('dir /b /a-d "%%i\word\word*.word"') do (
  6.              set/a s+=1,s1=s%%6,s2+=1
  7.              call set n2=%%_!s!%%
  8.              if !s2! gtr 6 set s2=1&set var=%%k
  9.              if !s1! equ 1 (
  10.              if !n! neq 0 (
  11.              >>"%%i\%%i!n!.txt" echo;^<p^>
  12.              >>"%%i\%%i!n!.txt" echo;^<p^>!_n!^<P^>
  13.              )
  14.              set/a n+=1
  15.              >"%%i\%%i!n!.txt" echo;^<p^>
  16.              >>"%%i\%%i!n!.txt" echo;^<a !n2! !s2!^>^<word/%%k^>
  17.              call set _n=%%_!s!%%
  18.           ) else >>"%%i\%%i!n!.txt" echo;^<a !n2! !s2!^>^<word/%%k^>
  19.         )
  20.       if !s2! equ 1 (
  21.       >"%%i\%%i!n!.txt" echo;^<p^>
  22.       >>"%%i\%%i!n!.txt" echo;^<a !n2! !s2!^>^<word/!var!^>
  23.       )
  24.       >>"%%i\%%i!n!.txt" echo;^<p^>
  25.       >>"%%i\%%i!n!.txt" echo;^<p^>!_n!^<P^>
  26.     )
  27.   )
  28. )
  29. pause&exit
复制代码

[ 本帖最后由 terse 于 2009-1-21 11:10 编辑 ]
作者: ganjie    时间: 2009-1-21 08:12

测试了,10楼的代码输出的结果,正是小弟想要的,不过偶不怎么在乎效率的,只要结果好就行,麻烦大大了,谢谢!不过同时也测试了一下11楼的那个代码,如还是测试那两个文件夹psp、nds,nds输出三个文本nds1.txt、nds2、nds3均正确,psp则不然,psp1.txt的内容与nds1.txt相同、psp2.txt与nds2.txt相同、psp3.txt与nds3.txt相同。
作者: terse    时间: 2009-1-21 10:29

原帖由 ganjie 于 2009-1-21 08:12 发表
测试了,10楼的代码输出的结果,正是小弟想要的,不过偶不怎么在乎效率的,只要结果好就行,麻烦大大了,谢谢!不过同时也测试了一下11楼的那个代码,如还是测试那两个文件夹psp、nds,nds输出三个文本nds1.txt、nds ...

对不起 我疏忽了 set/a n=0,s=0,s2=0 改为 set/a n=0,s=0,s2=0,n1=0即可
另:没看到要求文本要生成至对应文件夹里  更新上面了




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