中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-10-01 21:15
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,279 会员排行
DOS批处理 & 脚本技术(批处理室) » 统计文本文件的字符个数
可打印版本  4,217 / 31
第16楼 bat-zw 发表于 2008-04-25 22:11
金牌会员 发帖 1,276 积分 3,105
计算setlocal最大递归层(为32层):
可能有人会有这样的疑问: 不执行endlocal行不行。。
答案是也行, 就比如第二段代码

但是要记住: 一定要在 set "var=%%a"之前关闭掉 变量延迟

这样会不断的递归产生 环境表。

对于小文件还尚可。。 文件行数稍大便会 导致setlocal递归层数过大


在显示了32后就会提示:setlocal已到最大递归层,而在echo !str!下面加上endlocal就不会有这个提示了。

[ Last edited by zw19750516 on 2008-4-25 at 10:14 PM ]
第17楼 bjsh 发表于 2008-04-25 22:24
银牌会员 发帖 621 积分 2,000
受10楼兄弟的启发, 下面这个代码即可统计 不必产生临时文件,
而且也 发现了 把变量传递回来的好办法。 很聪明的一个办法。。。


主要在两点。。
1) 让 set /a total+=n 脱离 循环的区域 但又被执行到
原因是为了避免 在for中 没执行前的命令行扫描 即将 n 替换掉
2)endlocal&&set /a total+=n
很聪明的做法 也是传递回来的根本原因所在
因为在一行。。。 所以 命令行 会对整体进行扫描
因为扫描时还没有执行endlocal, n 的值仍然存在, 而对其的替换恰发生在此时
扫描完毕后 真正执行时,endlocal 后 还原回原来的环境变量表, 但是
set /a total+=n 在扫描后 n 被替换为一个确定的值, 因此n的值通过total
被传递回原来的环境表量表

刚好利用了 扫描替换变量和执行的时间差。。

注意一定要在同一行,
endlocal
set /a total+=n
分开写, 第二行则永远是零了。。

[ Last edited by bjsh on 2008-4-26 at 11:27 AM ]
第18楼 plp626 发表于 2008-04-25 22:37
银牌会员 发帖 1,020 积分 2,278
2)endlocal&&set /a total+=n

这个是函数常用的格式:

有参函数:



详细这个帖子:

http://www.cn-dos.net/forum/viewthread.php?tid=38969&fpage=1

既然版主都来了,相比能给这个帖子提些建设性的意见.....
我在做这方面的工作,一个人太累,
第19楼 pusofalse 发表于 2008-04-25 22:58
银牌会员 发帖 646 积分 1,604
Originally posted by bjsh at 2008-4-25 10:24 PM:
受10楼兄弟的启发, 下面这个代码即可统计 不必产生临时文件,
而且也 发现了 把变量传递回来的好办法。 很聪明的一个办法。。。
第20楼 26933062 发表于 2008-04-25 23:03
银牌会员 发帖 879 积分 2,268
回复 17 楼
最开始也是采用这种方法,但实际上是不行的,
不信把a.txt内容超过32行,同样会提示 以达到最大递归层,
并且在末位 echo !total! 同样有结果,说明 延迟变量还是开启的.
在返回call主程序之前endlocal 好像并不能结束延迟变量
endlocal&set /a w+=n 这种方法好像在for中无效,也就是在()中无效,所以在10楼,先跳出for即可.

[ Last edited by 26933062 on 2008-4-25 at 11:09 PM ]
第21楼 dreamseed 发表于 2008-04-25 23:47
初级用户 发帖 10 积分 38 来自 GZ
第22楼 bjsh 发表于 2008-04-26 00:09
银牌会员 发帖 621 积分 2,000
Originally posted by 26933062 at 2008-4-25 11:03 PM:
回复 17 楼
最开始也是采用这种方法,但实际上是不行的,
不信把a.txt内容超过32行,同样会提示 以达到最大递归层,
并且在末位 echo !total! 同样有结果 ...


确实。。。
setlocal 和 endlocal 必须得在一个 块 内。。


还真得就这么写了。。




回复 19楼。。
出错 也是 因为这个原因了。。 更改了源代码了。。

[ Last edited by bjsh on 2008-4-26 at 11:25 AM ]
第23楼 bjsh 发表于 2008-04-26 00:15
银牌会员 发帖 621 积分 2,000
Originally posted by plp626 at 2008-4-25 10:37 PM:

这个是函数常用的格式:

有参函数:

第24楼 bat-zw 发表于 2008-04-26 10:26
金牌会员 发帖 1,276 积分 3,105
我来说两句,不对请指正:
&&我们知道要原样输出文本如a.txt内容最好的方法就是使用type:
@type a.txt&pause>nul
那么bjsh版主在8楼总结出的代码,是不是可以把findstr改为type,一来可以提高代码效率,二来还可以简化代码(不足之处是会忽略以";"号打头的行):

测试文本如下(用版主的测试提示找不到操作数):


[ Last edited by zw19750516 on 2008-4-26 at 11:20 AM ]
第25楼 26933062 发表于 2008-04-26 11:00
银牌会员 发帖 879 积分 2,268
回 24 楼
for /f "delims=" %%i in ('type x.txt') do set  会忽略分号开头的行

对文档字符,字节进行详细统计,含特殊字符

a.txt 内容
第26楼 bat-zw 发表于 2008-04-26 11:14
金牌会员 发帖 1,276 积分 3,105
Originally posted by 26933062 at 2008-4-26 11:00:
回 24 楼
for /f "delims=" %%i in ('type x.txt') do set  会忽略分号开头的行

对文档字符,字节进行详细统计,含特殊字符
:
第27楼 bjsh 发表于 2008-04-26 11:25
银牌会员 发帖 621 积分 2,000
Originally posted by zw19750516 at 2008-4-26 10:26 AM:
测试文本如下(用版主的测试提示找不到操作数):


呵呵

找不到操作数 是我忘了空行的情况

其实用 findstr 而不用type 当初也是因为这空行

空行时, 因为n没定义, 导致 endlocal 后的 set /a 报错 说 没有操作数:
在
setlocal enabledelayedexpansion
后加一句
set /a n=0
即可。

已修正。。
第28楼 bjsh 发表于 2008-04-26 11:32
银牌会员 发帖 621 积分 2,000
效率么。。 确实很差。。

用批处理来写 就是写这么个算法。

不适合真正拿来用。。

字符处理 是 cmd 的一个瓶颈。。

最好还是用其他的方式来解决。。

用最适合的方式解决最适合的问题。。
第29楼 bat-zw 发表于 2008-04-26 13:39
金牌会员 发帖 1,276 积分 3,105
严重同意版主的意见!!!
第30楼 09wind 发表于 2010-01-10 12:34
新手上路 发帖 1 积分 1
.
.
.
.



为什么要end local 啊 不关闭也可以执行啊。







@echo off& mode con cols=40 lines=10& setlocal enabledelayedexpansion& color 9f
(if "%~1"=="" (echo 把文件托到这里,然后按个回车:
set /p wind_F=)else set wind_F=%~1)& cls
for /f "tokens=1* delims=:" %%1 in ('findstr /n ".*" "%wind_F%"')do (set "wind=%%2"& set /a LN=0,snow=%%1
if not defined wind (set /a wind_E+=1)else call :smile)
echo 共%snow%行 %TAT%个字符
if defined wind_E echo 其中包含%wind_E%个空行
pause 1>nul&& exit
:smile
if defined wind (set wind=!wind:~1!&& set /a LN+=1&& goto :smile)else set /a TAT+=LN
上一页  1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023