Board logo

标题: [代码合集] 查找文本文档最长行的批处理错在哪里了? [打印本页]

作者: BS0小陈    时间: 2011-6-26 10:21     标题: 查找文本文档最长行的批处理错在哪里了?

为什么我一下代码都是显示第一行啊????
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a m=0
  4. for /f "delims=" %%a in (1.txt) do (
  5. set /a n=0
  6. set aa=%%a
  7. set bb=!aa: =!
  8. if "!bb!" neq "" (
  9. set /a n+=1
  10. set bb=!bb:~1!
  11. )
  12. if !n! gtr !m! (
  13. set shuchu=!aa!
  14. set m=!n!
  15. )
  16. )
  17. echo !shuchu!
  18. pause
复制代码

作者: BS0小陈    时间: 2011-6-26 10:51

试了试改了一下,就可以了!不知道为什么啊?求解
没有call怎么就可以了?
下面是用了call的代码,是正确的。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a m=0
  4. for /f "delims=" %%a in (1.txt) do (
  5. set /a n=0
  6. set aa=%%a
  7. set bb=!aa: =!
  8. call :11
  9. )
  10. echo !shuchu!
  11. pause
  12. :11
  13. if "!bb!" neq "" (
  14. set /a n+=1
  15. set bb=!bb:~1!
  16. goto 11
  17. )
  18. if !n! gtr !m! (
  19. set shuchu=!aa!
  20. set m=!n!
  21. )
  22. goto :eof
复制代码

作者: tmplinshi    时间: 2011-6-26 10:56

if "!bb!" neq "" (
set /a n+=1
set bb=!bb:~1!
)

你以为这句是循环?不是的。
----------------------------------------
  1. @echo off
  2. set /a LineNum = 0, MaxLen = 0, n = 0
  3. for /f "delims=" %%a in (1.txt) do (
  4.    set /a LineNum += 1
  5.    set s=%%a#
  6.    setlocal enabledelayedexpansion
  7.     for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  8.         if "!s:~%%a,1!" neq "" (
  9.             set /a n += %%a
  10.             set s=!s:~%%a!
  11.         )
  12.     )
  13.     if !n! gtr !MaxLen! (
  14.         for %%n in (!n!) do (
  15.             endlocal
  16.             set MaxLen=%%n
  17.             set str=%%a
  18.         )
  19.     ) else endlocal
  20. )
  21. set LineNum
  22. set MaxLen
  23. set str
  24. 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遍历,不过若不遍历,也就无法支持宽字符了:
  1. @echo off&setlocal enabledelayedexpansion
  2. set f=....
  3. for /l %%a in (0 1 9) do set f=!f!!f!
  4. set f=!f!!f:~-4093!
  5. ::创建一个长度为8189的变量f,日后作为文件名以及findstr通配符出现
  6. copy 1.txt !f:~-125!.$
  7. findstr .* *.$>$
  8. ::sort /rec开关至少要128个字符才起效的限制,所以为1.txt中的内容凑够128个字符的前缀
  9. set n=8192
  10. for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  11.         sort /rec !n! $&&set /a n-=%%a||set /a n+=%%a
  12. )>nul 2>nul
  13. set /a n=n-128
  14. ::判断最长行字符数
  15. findstr /x "!f:~-%n%!" 1.txt
  16. ::查找最长行,但是因为findstr匹配的是字节,所以碰到存在宽字符的文件,还是老老实实遍历吧
  17. del *.$
  18. 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