Board logo

标题: [文本处理] [已解决]批处理如何从一个文件中提取信息? [打印本页]

作者: cyndy_li    时间: 2009-12-3 16:34     标题: [已解决]批处理如何从一个文件中提取信息?

功能要求:原始文件每行有两个元素,一个是md5值(一串16进制码),另一个是文件名带绝对路径,在文件中查找具有相同md5值的行,把对应的文件删除。
附件是原始文件,和我写的批处理,不知道问题,在哪,总是不对,
怀疑:for循环的in 文件,不可以在循环内部更改。
  1. @echo off
  2. set  notmatch=200910.txt
  3. for /f  "tokens=1,2" %%i in (%notmatch%) do (
  4. for /f  "skip=1 tokens=1,2" %%k in (%notmatch%) do (
  5. if  %%i == %%k (
  6. echo %%k %%l>>match.txt
  7. )else echo %%k %%l>>temp.txt
  8. )
  9. copy temp.txt 200910.txt
  10. )
复制代码

作者: cyndy_li    时间: 2009-12-3 16:36     标题: 希望高手指点下

有别的思路,也请指点下
作者: cyndy_li    时间: 2009-12-3 16:42

[attach]2058[/attach]
作者: batman    时间: 2009-12-3 16:58

  1. @echo off
  2. for /f "tokens=1,2" %%a in (200910.txt) do (
  3.      if defined _%%a (
  4.         if exist "%%b" del /f /q "%%b"
  5.         ) else (
  6.        set "_%%a=a"
  7.     )
  8. )
  9.      
复制代码

作者: cyndy_li    时间: 2009-12-3 17:23

if 后面的defined是什么意思, if 的语法里面好像没有这个词啊
还有%%a前面的下划线是什么意思,

我是新手,麻烦您多给解释点
作者: batman    时间: 2009-12-3 17:27

这里有defined的详解:
http://bbs.bathome.net/viewthrea ... highlight=%2Bbatman
作者: cyndy_li    时间: 2009-12-3 19:22

非常感谢batman,你的方法处理起来好快,有一个问题,如果不同的md5
值太多,set的 变量如果很多会不会造成什么不良后果。
我有点不死心,嵌套循环应该也可以的吧,我也很想知道如果用嵌套循环应该怎么写。这个要求有点过分:)
我也再想一下
再次感谢batman。
作者: cyndy_li    时间: 2009-12-3 20:44

  1. @echo off
  2. set notmatch=200910.txt
  3. for /f "tokens=1,2" %%i in (%notmatch%) do (
  4. echo hi>temp.txt
  5. for /f "skip=1 tokens=1,2" %%k in (%notmatch%) do (
  6. if %%i == %%k (
  7. echo %%k %%l>>match.txt
  8. )else echo %%k %%l>>temp.txt
  9. )
  10. copy temp.txt temp1.txt
  11. set notmatch=temp1.txt
  12. )
复制代码



就是不对,总是重复删除,不知道错在哪
作者: cyndy_li    时间: 2009-12-3 21:30

很抱歉,我没有找到删除自己帖子的地方,如果可以,我想删除8楼
方法我找到了,贴代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo classed>match.txt             rem  多次执行此批处理文件时清空match文件
  4. set  notmatch=200910.txt      
  5. for /f  "tokens=1,2" %%i in (!notmatch!) do (
  6. echo unsame>temp.txt               rem  下一轮循环开始,清空temp.txt文件
  7. for /f  "tokens=1,2" %%k in (!notmatch!) do (
  8. if  %%i == %%k (
  9. echo %%k %%l>>match.txt            rem  match文本文件始终累积写入
  10. )else echo %%k %%l>>temp.txt
  11. )
  12. copy temp.txt temp1.txt
  13. set notmatch=temp1.txt
  14. )
复制代码
代码会将原始文件相同md5值的行输出在相邻行进行排列,输出在match.txt 中
作者: batman    时间: 2009-12-4 00:15

原帖由 cyndy_li 于 2009-12-3 19:22 发表
非常感谢batman,你的方法处理起来好快,有一个问题,如果不同的md5
值太多,set的 变量如果很多会不会造成什么不良后果。
我有点不死心,嵌套循环应该也可以的吧,我也很想知道如果用嵌套循环应该怎么写。这个要求 ...

如果处理的数据量相当大的话,用for嵌套将会很慢,用findstr效率也会不高,可以考虑建立临时文件的方法:
  1. @echo off
  2. for /f "tokens=1,2" %%a in (200910.txt) do (
  3.      if not exist "%temp%\$%%a" (
  4.         cd.>"%temp%\$%%a"
  5.         ) else (
  6.         if exist "%%b" del /f /q "%%b"
  7.      )
  8. )
  9. del /f /q "%temp%\$*"
复制代码

作者: 随风    时间: 2009-12-5 23:29

不用设置大量的变量
测试成功的话,删除 echo 即可
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims= " %%a in ('sort 200910.txt') do (
  3.    if "!str!"=="%%a" (
  4.       if exist "%%b" echo del /q "%%b"
  5.     )
  6.     set "str=%%a"
  7. )
  8. pause
复制代码

作者: cyndy_li    时间: 2009-12-6 22:04

to 随风 超级版主:
       真的学习了,很佩服,各位超级版主真不是随便叫的。
       和你学了sort命令,我费那么大劲,就完成这一个命令。
       还有你设置变量的方式,真是,我真是不知道怎么形容,高。
作者: cyndy_li    时间: 2009-12-6 22:23

to  batman:
        恕我愚钝,刚才一直在研究你的代码,那个$符号到底什么意思,后来发现只是加在文件名前方便删除用的。多谢您的耐心教授。




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