标题: [文本处理] [已解决]批处理如何从一个文件中提取信息? [打印本页]
作者: cyndy_li 时间: 2009-12-3 16:34 标题: [已解决]批处理如何从一个文件中提取信息?
功能要求:原始文件每行有两个元素,一个是md5值(一串16进制码),另一个是文件名带绝对路径,在文件中查找具有相同md5值的行,把对应的文件删除。
附件是原始文件,和我写的批处理,不知道问题,在哪,总是不对,
怀疑:for循环的in 文件,不可以在循环内部更改。- @echo off
- set notmatch=200910.txt
-
- for /f "tokens=1,2" %%i in (%notmatch%) do (
-
- for /f "skip=1 tokens=1,2" %%k in (%notmatch%) do (
- if %%i == %%k (
-
- echo %%k %%l>>match.txt
-
- )else echo %%k %%l>>temp.txt
-
- )
- copy temp.txt 200910.txt
- )
复制代码
作者: cyndy_li 时间: 2009-12-3 16:36 标题: 希望高手指点下
有别的思路,也请指点下
作者: cyndy_li 时间: 2009-12-3 16:42
[attach]2058[/attach]
作者: batman 时间: 2009-12-3 16:58
- @echo off
- for /f "tokens=1,2" %%a in (200910.txt) do (
- if defined _%%a (
- if exist "%%b" del /f /q "%%b"
- ) else (
- set "_%%a=a"
- )
- )
-
复制代码
作者: 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
- @echo off
- set notmatch=200910.txt
-
- for /f "tokens=1,2" %%i in (%notmatch%) do (
- echo hi>temp.txt
- for /f "skip=1 tokens=1,2" %%k in (%notmatch%) do (
- if %%i == %%k (
-
- echo %%k %%l>>match.txt
-
- )else echo %%k %%l>>temp.txt
-
- )
- copy temp.txt temp1.txt
- set notmatch=temp1.txt
- )
复制代码
就是不对,总是重复删除,不知道错在哪
作者: cyndy_li 时间: 2009-12-3 21:30
很抱歉,我没有找到删除自己帖子的地方,如果可以,我想删除8楼
方法我找到了,贴代码如下:- @echo off
- setlocal enabledelayedexpansion
-
- echo classed>match.txt rem 多次执行此批处理文件时清空match文件
-
- set notmatch=200910.txt
-
- for /f "tokens=1,2" %%i in (!notmatch!) do (
-
- echo unsame>temp.txt rem 下一轮循环开始,清空temp.txt文件
-
- for /f "tokens=1,2" %%k in (!notmatch!) do (
-
- if %%i == %%k (
-
- echo %%k %%l>>match.txt rem match文本文件始终累积写入
-
- )else echo %%k %%l>>temp.txt
-
- )
- copy temp.txt temp1.txt
- set notmatch=temp1.txt
- )
复制代码
代码会将原始文件相同md5值的行输出在相邻行进行排列,输出在match.txt 中
作者: batman 时间: 2009-12-4 00:15
原帖由 cyndy_li 于 2009-12-3 19:22 发表
非常感谢batman,你的方法处理起来好快,有一个问题,如果不同的md5
值太多,set的 变量如果很多会不会造成什么不良后果。
我有点不死心,嵌套循环应该也可以的吧,我也很想知道如果用嵌套循环应该怎么写。这个要求 ...
如果处理的数据量相当大的话,用for嵌套将会很慢,用findstr效率也会不高,可以考虑建立临时文件的方法:
- @echo off
- for /f "tokens=1,2" %%a in (200910.txt) do (
- if not exist "%temp%\$%%a" (
- cd.>"%temp%\$%%a"
- ) else (
- if exist "%%b" del /f /q "%%b"
- )
- )
- del /f /q "%temp%\$*"
复制代码
作者: 随风 时间: 2009-12-5 23:29
不用设置大量的变量
测试成功的话,删除 echo 即可- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1* delims= " %%a in ('sort 200910.txt') do (
- if "!str!"=="%%a" (
- if exist "%%b" echo del /q "%%b"
- )
- set "str=%%a"
- )
- pause
复制代码
作者: cyndy_li 时间: 2009-12-6 22:04
to 随风 超级版主:
真的学习了,很佩服,各位超级版主真不是随便叫的。
和你学了sort命令,我费那么大劲,就完成这一个命令。
还有你设置变量的方式,真是,我真是不知道怎么形容,高。
作者: cyndy_li 时间: 2009-12-6 22:23
to batman:
恕我愚钝,刚才一直在研究你的代码,那个$符号到底什么意思,后来发现只是加在文件名前方便删除用的。多谢您的耐心教授。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |