[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理怎样读取txt某行某字段,改名写入XML?

本帖最后由 meteormiao 于 2011-4-12 16:42 编辑

有个文件a.txt
需要读取它里面第二行“萨鲁发骄傲了9月10日14时说的”中的月日时的时间,
然后将文件名改为"tp年月日时.txt"(其中年4位,其他2位),并移动到b目录下
同时写入c.xml文件,格式如下:
<?xml version="1.0" encoding="utf-8" ?>
- <files>
<file year="2011" month="3" day="25" name="想来就来是" url="http://10.10.10.10/tp年月日.txt" />
</files>
之后每来新的txt文件,就在这个xml文件基础上进行file增项,逆序排列,最新项写在最上面。(其中年,月,日,文件名这四项是需要变动的)

小弟刚开始学批处理,论坛精华也看了一些,写了几段,但就是拼不出个能用的,无奈求助,请各位朋友能帮一把,谢谢了~~~14
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

1,是否每个文件的第二行都有类似的“11年9月10日”?此日期是否有具体的格式规范?
2,是否文件名应改为“11年9月10日.txt”?
3,<file year="2011" month="3" day="25" name="想来就来是" url="http://10.10.10.10/tp年月日.txt" />
中,除“tp年月日.txt”外其他部分都是固定的?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

本帖最后由 meteormiao 于 2011-4-6 14:19 编辑

感谢版主提醒,发现了几处提问的小问题,现修改并回答如下:
1.每个文件第二行都有“XX月XX日XX时”(问题里写错了,没有年,例如:北京市交通台11月29日15时56分发布),统一是这个格式。
2.文件名需要改为“tpXXXXXXXXXX.TXT“(年4位,月日时各两位,不需要分)。
3.<file year="2011" month="3" day="25" name="想来就来是" url="http://10.10.10.10/tp年月日时.txt" />
中,变动的部分有:(1)year="年"
                           (2)monte="月"
                           (3)day="日"
                           (4)tp年月日时.txt
回答完毕
就是感觉问题有点复杂,反而无从下手了

TOP

3# meteormiao


1,年份从哪获取?当前日期的?文件创建日期的?
2,每个文件第二行都有“XX月XX日XX时”,那么3月2日早上8点应该是“03月02日08时”了?
3,<file year="2011" month="3" day="25" name="想来就来是" url="http://10.10.10.10/tp年月日时.txt" />
这里的 month="3" 的3是怎么成3而不是03了?去掉前面的0?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

版主真是句句文在点上,汗颜啊。
1.年份取当前日期的。
2.文件中出现的时间是只保留整数位的,比如:3月2日8时,但转换文件名时,不足需进行补0操作,也就是文件名变为“tp2011030208.txt。
3.在XML中,month和day也是只保留整数位,不进行补零操作。

TOP

代码未测试:
  1. @echo off&setlocal enableDelayedExpansion
  2. set "e=a.txt"
  3. set "f=c.xml"
  4. set "h=b"
  5. for /f "usebackq skip=1 tokens=1-3 delims=月日时" %%a in ("%e%") do (
  6. set b=%%b&set c=%%c
  7. call:b "%%a"
  8. goto:a
  9. )
  10. :a
  11. set a_=0%a%&set b_=0%b%&set c_=0%c%
  12. move "%e%" "%b%\tp%date:~0,4%%a_:~-2%%b_:~-2%%c_:~-2%.txt"
  13. (
  14. echo;^<?xml version="1.0" encoding="utf-8" ?^>
  15. echo;- ^<files^>
  16. echo;^<file year="%date:~0,4%" month="%a%" day="%b%" name="想来就来是" url="http://10.10.10.10/tp%date:~0,4%%a_:~-2%%b_:~-2%%c_:~-2%.txt" /^>
  17. for /f "usebackq skip=2 delims=" %%a in ("%f%") do (
  18. set g=%%a
  19. if /i "!g:~0,10!"=="<file year" echo;!g!
  20. )
  21. echo;^</files^>
  22. )>$tmp
  23. move $tmp "%f%"
  24. exit
  25. :b
  26. set "a=%~1"
  27. if "%a:~1%"=="" goto:eof
  28. set/a d=%a:~-2,1% 2>nul
  29. if "%d%"=="%a:~-2,1%" (set a=%a:~-2%) else set a=%a:~-1%
复制代码
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

有一个小瑕疵
move "%e%" "%b%\tp%date:~0,4%%a_:~-2%%b_:~-2%%c_:~-2%.txt"
中的%b%改为%h%就OK了。
非常感谢版主,我从这个案例中学到了很多,再次感谢~~~

TOP

实际运行中有一个问题,就是这个批处理并未对文件是否存在做判断,我每运行一次这个它就会执行一次写操作,如果目录下没有a.txt文件,也会在xml中写入一条空信息。。。
如果在变量赋值后,加入一个判断
if not exist a.txt goto:eof
这个程序就更好了,呵呵

TOP

返回列表