中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助] For 在读取txt时莫名退出
作者:
标题: [求助] For 在读取txt时莫名退出 上一主题 | 下一主题
terrytong
中级用户





积分 240
发帖 115
注册 2008-3-10
状态 离线
『楼 主』:  [求助] For 在读取txt时莫名退出

现有一个txt文件(B12.txt,如附件), 我用FOR计算里面的PASS和FAIL的数量,但是不知道为什么数量总是不对.
代码如下:
@echo off
setlocal enabledelayedexpansion
set P=0
set f=0
for /f "tokens=1 delims==" %%a in (B12.txt) do (
               set result=%%a
               set result=!result: =!
               if !result! == PASS set /a P+=1
               if !result! == FAIL set /a F+=1
)
echo !pass!
echo !Fail!
pause

发现每次FOR只能读到577行就会退出.
然后我打开B12.txt, 直接保存下再读,数量就会正确了,可是怎么也想不通,为什么我什么都没做,只是打开保存了一下就可以读出正确的数值?
请高手们帮我看看是什么原因倒致我刚开始读的数量不正确?
谢谢!

[ Last edited by terrytong on 2010-5-9 at 13:13 ]

附件 1: B12.rar (2010-5-9 13:11, 15.14 K,下载次数: 7)
2010-5-9 13:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tongzj
初级用户





积分 49
发帖 43
注册 2007-1-20
状态 离线
『第 2 楼』:  

应该是文本格式错误,重新保存后格式修正了就好了。

[ Last edited by tongzj on 2010-5-9 at 13:45 ]

2010-5-9 13:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terrytong
中级用户





积分 240
发帖 115
注册 2008-3-10
状态 离线
『第 3 楼』:  

请问除了手动打开再保存后还有更好的办法修正格式错误?
另外想问下一般什么样的情况下会导致这种格式错误啊?

2010-5-9 14:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 4 楼』:  

我好像是文本里有些莫明的代码或者字符,批处理会出错




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2010-5-9 14:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 5 楼』:  

原因:在第578行行首有连续51个空字符(00),重新保存后转成51个空格符(20)。
解决:more命令自动将00空字符转成换行(空行)
可以使用下面的代码处理:
@echo off
for /f "delims==" %%a in ('type B12.txt^|more') do (
               if /i "%%a"=="PASS" set/a P+=1
               if /i "%%a"=="FAIL" set/a F+=1
)
echo.%p%和%F%
pause
不能使用下面的代码,因为将导致P被少计算:
@echo off
for /f "delims==" %%a in ('type B12.txt') do (
               if /i "%%a"=="PASS" set/a P+=1
               if /i "%%a"=="FAIL" set/a F+=1
)
echo.%p%和%F%
pause

@echo off
for /f "delims==" %%a in ('findstr .* B12.txt') do (
               if /i "%%a"=="PASS" set/a P+=1
               if /i "%%a"=="FAIL" set/a F+=1
)
echo.%p%和%F%
pause
[ Last edited by Hanyeguxing on 2010-5-9 at 16:55 ]

   此帖被 +3 点积分       点击查看详情   
评分人:【 terrytong 分数: +3  时间:2010-5-9 16:17




批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-5-9 14:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terrytong
中级用户





积分 240
发帖 115
注册 2008-3-10
状态 离线
『第 6 楼』:  

非常感谢你的帮忙,谢谢!

再请教下,你是怎么看出是空字符还是空格的?

2010-5-9 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 7 楼』:  

1,实际上做多了,直接看578行,就能知道是怎么回事
2,打开B12,另存为B13
3,使用下面的代码:
Fc /n B12.txt B13.txt
说明:

  Quote:
正在比较文件 B12.txt 和 B13.TXT
***** B12.txt
  577:  PASS=CVPO017401VW080JGN =2010-04-22 13:01:20=PASS
  578:  
  579:  
......中间的被我省略了
  628:  
  629:  PASS=CVPO017401XR080JGN =2010-04-22 13:12:12=PASS
  630:  PASS=CVPO0174020Y080JGN =2010-04-22 13:19:08=PASS
***** B13.TXT
  577:  PASS=CVPO017401VW080JGN =2010-04-22 13:01:20=PASS
  578:                                                     PASS=CVPO017401XR080JGN =2010-04-22 13:12:12=PASS
  579:  PASS=CVPO0174020Y080JGN =2010-04-22 13:19:08=PASS
*****

4,使用下面的命令查看不同的字符是什么:
Fc /b B12.txt B13.txt
说明:

  Quote:
正在比较文件 B12.txt 和 B13.TXT
00007348: 00 20
00007349: 00 20
......中间的被我省略了
00007379: 00 20
0000737A: 00 20

5,也可以使用UltraEdit-32等32位编辑器比较。

[ Last edited by Hanyeguxing on 2010-5-10 at 09:53 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-5-9 16:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: