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

[文本处理] 批处理如何用FOR比较上下文?

有一文本 a.txt ,内容为:
  1. ABC
  2. 123
  3. EFGfd
  4. 4237
  5. 123
复制代码

进一步解释:
假如第二行的“123”和第四行的“4237”中存在共同部分“23”在提取该两行。如何解释变量和过程?
要求比较文本的上下文——也就是比较每一行,假如有相同的,如“123”就提取——打印。否则……
最好用FOR,但不要用sort,其它方法可以参照,能够通用的,因为经常遇到这类问题需要处理。
这只是个例子,我要的目的是如何设置变量以便对上下文——其实在FOR里面就是循环时间的前和后两个变量之间进行的比较。
比如:
  1. for /f %%a in (a.txt) do set var=%%a
复制代码
因为a.txt有五行内容,该FOR将有五次循环,假如用直接用 “if %var%==%var%”它是永远相等的,关键是在时间差上设置变量。

[ 本帖最后由 cjiabing 于 2010-8-27 09:44 编辑 ]

晕,搜索到了,不过自己看不懂了。看看大家有没有更好的。
求和:时间前和时间后的和
  1. @echo off&setlocal EnableDelayedExpansion
  2. ::用于文档累计,算文档内数字的总和,数字需竖列,没试过横列的以及其它方式的
  3. set str=
  4. for /f %%a in (XT量表1结果.txt) do (
  5. for /f %%i in ("!str!") do set mum1=%%i>nul
  6. set str=%%a
  7. set /a var=!mum1!+%%a
  8. set str=!var!
  9. )
  10. echo !var!
复制代码
http://www.bathome.net/thread-7410-1-52.html

TOP

  1. @echo off&setlocal EnableDelayedExpansion
  2. Set "Num=0"
  3. For /f "tokens=*" %%i in (a.txt) Do (
  4.     Set "test=%%i"
  5.     Set /a "Num+=1"
  6.     For /f "tokens=*" %%j in ('More +!Num! ^<a.txt') Do (
  7.         If "%%j"=="!test!" echo %%j
  8.     )
  9. )
  10. pause
复制代码

还有些小Bug,先占个位子,继续研究下....(^_^)

[ 本帖最后由 canyuexiaolang 于 2010-8-27 07:23 编辑 ]

TOP

  1. @echo off
  2. for /f "tokens=*" %%a in (ttt.txt) do (
  3. for /f "tokens=3" %%b in ('find /c "%%a" ttt.txt') do if %%b gtr 1 if not defined %%a set "%%a=xx"&echo,%%a
  4. )
  5. pause
复制代码

TOP

原帖由 yangfengoo 于 2010-8-27 07:39 发表
@echo off
for /f "tokens=*" %%a in (ttt.txt) do (
for /f "tokens=3" %%b in ('find /c "%%a" ttt.txt') do if %%b gtr 1 if not defined %%a set "%%a=xx"&echo,%%a
)
pause

兄弟这个只能说是“提取指定行”,但不能通用于比较上下行的内容,假如要求比较的不是数字,而是字母和汉字怎么办?

TOP

原帖由 canyuexiaolang 于 2010-8-27 07:22 发表
@echo off&setlocal EnableDelayedExpansion
Set "Num=0"
For /f "tokens=*" %%i in (a.txt) Do (
    Set "test=%%i"
    Set /a "Num+=1"
    For /f "tokens=*" %%j in ('More +!Num! ^

兄弟这个可以,谢谢。
不过你说的BUG是什么?
我对题目做了些小改动,你再看看红色部分,试试能不能比较。可能有点难度,得不得无所谓,我想了解下思路而已。

[ 本帖最后由 cjiabing 于 2010-8-27 09:59 编辑 ]

TOP

Bug就是当你的文本里面有多个相同的时候,就是2个以上,会打印出3个额。。

红色的应该用find或这findstr吧。我看看

==================================================

红色貌似有点难度哦...

[ 本帖最后由 canyuexiaolang 于 2010-8-27 10:10 编辑 ]

TOP

原帖由 canyuexiaolang 于 2010-8-27 10:01 发表
Bug就是当你的文本里面有多个相同的时候,就是2个以上,会打印出3个额。。

红色的应该用find或这findstr吧。我看看

==================================================

红色貌似有点难度哦...

呵呵,先谢了。不过用find可能达不到我的要求。
实际上我想设置两个变量,%a1%和%a2%,然后用他们来比较。假如用find的话就会很笼统,只能知道该行有没有包含指定字符,无法进一步对文本内容进行编辑。因此,关键在于两个变量的设置
  1. set  a1=123
  2. set  a2=4237
复制代码
给你一个思路,使用两个for /f,分别设置它们的变量
  1. set a1=%%a
  2. set a1=%%i
  3. if !a1!==!a2! echo !a1!
复制代码
至于里面的相同部分“23”可以根据实际情况来提取。但这个代码的弊端就是,比较两行时速度还过得去,假如设置10个变量,用到10个FOR的时候它就吃力的紧了。正为此头疼ing……

[ 本帖最后由 cjiabing 于 2010-8-27 10:26 编辑 ]

TOP

用变量截取会不会简单点....截取123的2个...在截取4237的2个..比较
举个例子  
set a1=123
set a2=4237
比较  %a1:~0,2%  %a2:~0,2%  
            %a1:~1,3%  %a2:~1,3%

TOP

原帖由 canyuexiaolang 于 2010-8-27 12:18 发表
用变量截取会不会简单点....截取123的2个...在截取4237的2个..比较
举个例子  
set a1=123
set a2=4237
比较  %a1:~0,2%  %a2:~0,2%  
            %a1:~1,3%  %a2:~1,3%

截取到之后如何处理?FOR如何写?

TOP

我感觉用批处理来做这个题很麻烦。如果是手动指定“共同部分”的话,用findstr就可以,但是如果要自动判断的话,字符串长度很影响效率,而且共同部分也不好界定,共同几个字符则是一个很重要的问题
努力学习,努力挣分

TOP

返回列表