标题: [代码合集] 查找文本文档最长行的批处理错在哪里了? [打印本页]
作者: BS0小陈 时间: 2011-6-26 10:21 标题: 查找文本文档最长行的批处理错在哪里了?
为什么我一下代码都是显示第一行啊????- @echo off
- setlocal enabledelayedexpansion
- set /a m=0
- for /f "delims=" %%a in (1.txt) do (
- set /a n=0
- set aa=%%a
- set bb=!aa: =!
- if "!bb!" neq "" (
- set /a n+=1
- set bb=!bb:~1!
- )
- if !n! gtr !m! (
- set shuchu=!aa!
- set m=!n!
- )
- )
- echo !shuchu!
- pause
复制代码
作者: BS0小陈 时间: 2011-6-26 10:51
试了试改了一下,就可以了!不知道为什么啊?求解
没有call怎么就可以了?
下面是用了call的代码,是正确的。- @echo off
- setlocal enabledelayedexpansion
- set /a m=0
- for /f "delims=" %%a in (1.txt) do (
- set /a n=0
- set aa=%%a
- set bb=!aa: =!
- call :11
- )
- echo !shuchu!
- pause
-
- :11
- if "!bb!" neq "" (
- set /a n+=1
- set bb=!bb:~1!
- goto 11
- )
- if !n! gtr !m! (
- set shuchu=!aa!
- set m=!n!
- )
- goto :eof
复制代码
作者: tmplinshi 时间: 2011-6-26 10:56
if "!bb!" neq "" (
set /a n+=1
set bb=!bb:~1!
)
你以为这句是循环?不是的。
----------------------------------------- @echo off
- set /a LineNum = 0, MaxLen = 0, n = 0
- for /f "delims=" %%a in (1.txt) do (
- set /a LineNum += 1
- set s=%%a#
- setlocal enabledelayedexpansion
- for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- if "!s:~%%a,1!" neq "" (
- set /a n += %%a
- set s=!s:~%%a!
- )
- )
- if !n! gtr !MaxLen! (
- for %%n in (!n!) do (
- endlocal
- set MaxLen=%%n
- set str=%%a
- )
- ) else endlocal
- )
-
- set LineNum
- set MaxLen
- set str
- pause
复制代码
作者: BS0小陈 时间: 2011-6-26 11:03
为什么不是循环啊 ,我不懂的。 for(if())不满足if就跳过啊,接着下一个for的循环,没问题啊
作者: BS0小陈 时间: 2011-6-26 11:08
你的代码: set s=%%a# 是什么看不懂的
批处理还有#,是什么啊 第一次看到
我是新手 不要喷我
作者: batman 时间: 2011-6-26 11:16
楼主参考下下面这个贴子:
http://www.bathome.net/viewthrea ... hlight=%C1%B7%CF%B0
ps:一楼的那个ccde你是不是可以改一下。。。
作者: CrLf 时间: 2011-6-26 11:33
本帖最后由 zm900612 于 2011-6-26 11:48 编辑
适合处理大文件,但是考虑到效率,将支持的最长行字符长度上限定为4196或者8189,以避开for遍历,不过若不遍历,也就无法支持宽字符了:- @echo off&setlocal enabledelayedexpansion
- set f=....
- for /l %%a in (0 1 9) do set f=!f!!f!
- set f=!f!!f:~-4093!
- ::创建一个长度为8189的变量f,日后作为文件名以及findstr通配符出现
-
- copy 1.txt !f:~-125!.$
- findstr .* *.$>$
- ::sort /rec开关至少要128个字符才起效的限制,所以为1.txt中的内容凑够128个字符的前缀
-
- set n=8192
- for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- sort /rec !n! $&&set /a n-=%%a||set /a n+=%%a
- )>nul 2>nul
- set /a n=n-128
- ::判断最长行字符数
-
- findstr /x "!f:~-%n%!" 1.txt
- ::查找最长行,但是因为findstr匹配的是字节,所以碰到存在宽字符的文件,还是老老实实遍历吧
-
- del *.$
- pause
复制代码
作者: tmplinshi 时间: 2011-6-26 11:33
本帖最后由 tmplinshi 于 2011-6-26 11:42 编辑
为什么不是循环啊 ,我不懂的。 for(if())不满足if就跳过啊,接着下一个for的循环,没问题啊
BS0小陈 发表于 2011-6-26 11:03
我回复的时候没看见你二楼的帖子,我说的是你一楼的代码,那里没有用 call。
------------------------------
你的代码: set s=%%a# 是什么看不懂的
批处理还有#,是什么啊 第一次看到
我是新手 不要喷我
BS0小陈 发表于 2011-6-26 11:08
# 只是普通字符。
作者: BS0小陈 时间: 2011-6-26 15:30
谢谢你们的回答,可是第一楼那个没有call的为什么不可以我还是表示不理解。
第二个用for的代码第一个为什么会不一样,所有带码几乎都一样啊?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |