Board logo

标题: 批处理计算一文本文件的行数 [打印本页]

作者: ieutk    时间: 2008-1-4 13:52     标题: 批处理计算一文本文件的行数

先把下面的COPY到你电脑上保存为list.txt
  1. abcealsdf
  2. sadflkew
  3. s657
  4. pe34
  5.            
  6. 534
  7. as4
  8. 563djhuqe
  9. d
复制代码
写一批处理计算此文件有多少行

[ 本帖最后由 ieutk 于 2008-1-4 14:18 编辑 ]
作者: myweb9169    时间: 2008-1-4 19:19

  1. @echo off
  2. for /f " delims=:" %%i in ('findstr /n "\<d\>" "list.txt"') do echo 共有:%%i行
  3. pause
复制代码
好像有内容一样的行就不行了
另外,这样也能,但想不通var值为什么是最后的值,而不是全部的值
@echo off
for /f " delims=:" %%i in ('findstr /n .* "list.txt"') do set var=%%i
echo %var%
pause
作者: 随风    时间: 2008-1-4 21:29

@echo off
for /f " delims=:" %%i in ('findstr /n "\<b\>" "a.txt"') do echo 共有:%%i行
pause
这段代码还真没看懂,
\<d\>  不是精确匹配字符串么? 这里匹配 d  是什么意识?而且换成别的字符就不行了.
难道 d 有什么特殊含义?

@echo off
for /f " delims=:" %%i in ('findstr /n .* "list.txt"') do set var=%%i
echo %var%
pause
这段代码var的值当然是最后的值
因为用findstr /n  打印了行号后,再用冒号作分割符,%%i的值就是行号,从1到12
而var的值也是依次是1到12 到了最后,当然就是最后的值了.
作者: myweb9169    时间: 2008-1-4 22:00

这里匹配 d  是什么意识?而且换成别的字符就不行了.
难道 d 有什么特殊含义?


想的太复杂了,这里的d只是本题中最后一行字符串的值,没什么特殊含义,呵呵
作者: ieutk    时间: 2008-1-5 00:17

@echo off
for /f " delims=:" %%i in ('findstr /n "\<d\>" "list.txt"') do echo 共有:%%i行
pause


这个代码可是可以,不过不太实际,如果文件最后不是d呢,所以还是用你下面的那个代码
作者: novaa    时间: 2008-1-7 19:17

  1. @echo off
  2. for /f "tokens=1 delims=:" %%i in ('findstr /n .* a.txt') do set Line=%%i
  3. echo %Line%
  4. pause
复制代码

作者: 希望的寄托    时间: 2008-2-19 13:10

历害历害,太历害了,我发现这个命令好难了
要是有像FOR那里面的通俗讲法就好了
作者: duanxianfell    时间: 2008-3-19 21:13

'findstr /n "\<d\>"   这个是什么意思?
作者: ieutk    时间: 2008-3-20 00:32

还请楼上兄弟另幵一贴来提问,以方便论坛的管理,多谢合作


'findstr /n "\<d\>"   这个是什么意思?


/N        在匹配的每行前打印行数。

"\<d\>" 是精确查找的意思

"\<......\>"  格式是这样的,中间的省略号代表你要精确查找的内容
作者: zhangxiaopeng    时间: 2008-4-4 11:13

二楼for /f "delims=:" %%i in ('findstr /n "\<d\>" "1.txt"') do set var=%%i
里面的"\<d\>"改为".*d\>"或是"d\<"都可以 ,更奇怪的是:".*d\>"里面的d改为任一字母都行。。。是不是这个命令本身就不需要。
作者: xiaoxx    时间: 2008-4-27 19:13

findstr的/n参数很好用。
但感觉还是不够底层。每行的分割符其实是那个看不见的回车啊.
for /f %%i in (a.txt) do ...感觉就像是bug了.
作者: wjta    时间: 2008-4-28 22:55

还请楼上兄弟另幵一贴来提问,以方便论坛的管理,多谢合作
引用:
'findstr /n "\<d\>"   这个是什么意思?
/N        在匹配的每行前打印行数。

"\<d\>" 是精确查找的意思

"\<......\>"  格式是这样的,中间的省略号代表你要精确查找的内容





谢谢你这么有耐心,学习.....
作者: tangfu    时间: 2008-6-10 23:45

终于搞懂了,for /f 默认循环第一列,所以findstr /n ....
1:abcealsdf
2:sadflkew
3:s657
4:pe34
5:
6:534
7:
8:
9:as4
10:
11:563djhuqe
12:d
后,用delims=:,可以分割出行号.....
作者: plp626    时间: 2008-6-11 19:10

文件非空行数:
  1. findstr/n . list.txt|find /c /v ""
复制代码

文件总行数(包括空行):
  1. type list.txt|find /c /v ""
复制代码

作者: 随风    时间: 2008-6-11 19:32

楼上强!
作者: wankoilz    时间: 2008-6-13 22:07

find /c /v ""
这是什么意思呢,居然结果直接就是个数字...不解..
作者: keen    时间: 2009-4-4 23:35

  1. @echo off
  2. for /f "tokens=1 delims=:" %%i in ('findstr /n .* a.txt') do set a=%%i
  3. echo %a%&pause
复制代码

作者: cainiao736    时间: 2009-4-6 22:47

14楼的好牛,学到了find的用法
作者: rat    时间: 2009-4-7 00:42

ding 14L.
Use the debug.exe:
  1. @for /f "skip=1 tokens=2" %%a in ('more /e +1 "%~f0"^|debug^|find ":0110"') do @set/an=0x%%a-4&call echo %%n%%&pause>nul&exit/b
  2. a100
  3. CMP     BYTE PTR [BX+0111],0D
  4. JNZ     010B
  5. INC     BYTE PTR [0110]
  6. INC     BX
  7. LOOP    0100
  8. INT     20
  9. nlist.txt
  10. l111
  11. g
  12. d110l1
  13. q
复制代码

作者: energy2009    时间: 2009-4-8 20:18

楼上的汇编写的什么,感觉您好牛啊!
麻烦注释下。。。3Q!
作者: sjzong    时间: 2009-5-4 23:35

find 命令真厉害!!
作者: keen    时间: 2009-5-5 16:17

find /o 法:
  1. @echo off
  2. for /f "delims=:" %%i in ('findstr /o .* list.txt') do set /a n+=1
  3. echo 总共有%n%行!&pause>nul
复制代码

作者: Batcher    时间: 2009-5-5 18:02     标题: 回复 22楼 的帖子

加上多余的/o开关会影响效率的吧?

其它几种方法:
  1. @echo off
  2. for /f "tokens=1 delims=:" %%a in ('findstr /n .* a.txt') do (
  3.     set RowNum=%%a
  4. )
  5. echo %RowNum%
  6. rem 10万行文本的测试结果:3分14.46秒
  7. rem 15:45:22.25
  8. rem 100000
  9. rem 15:48:36.71
复制代码
  1. @echo off
  2. for /f "tokens=2 delims=:" %%a in ('find /v /c "" a.txt') do (
  3.     set "RowNum=%%a"
  4.     goto :print
  5. )
  6. :print
  7. set "RowNum=%RowNum: =%"
  8. echo %RowNum%
  9. rem 10万行文本的测试结果:8.95秒
  10. rem 15:54:04.05
  11. rem 100000
  12. rem 15:54:13.00
复制代码
  1. @echo off
  2. for /f %%a in (a.txt) do (
  3.         set /a RowNum+=1
  4. )
  5. echo,%RowNum%
  6. rem 10万行文本的测试结果:5.20秒
  7. rem 15:51:30.55
  8. rem 100000
  9. rem 15:51:35.75
复制代码
  1. @echo off
  2. for /f %%a in ('type a.txt ^| find /c /v ""') do (
  3.         set "RowNum=%%a"
  4. )
  5. echo,%RowNum%
  6. rem 10万行文本的测试结果:2.92秒
  7. rem 15:57:54.64
  8. rem 100000
  9. rem 15:57:57.56
复制代码

作者: keen    时间: 2009-5-5 23:03     标题: 回复 23楼 的帖子

针对这个题目(list.txt文本中只有很少的内容),没有考虑效率。
当然,如果list.txt中的内容很多的话,效率的确是问题!!!
我只是想着一题多解。
谢谢指正。
作者: wjjy    时间: 2009-5-6 05:15

  1. @echo off
  2. for /f %%i in ('findstr  /n  "$" a.txt') do  set/a a+=1
  3. echo %a%
  4. pause
复制代码

作者: keen    时间: 2009-5-6 09:25     标题: 回复 25楼 的帖子

哥们,好像少了一行?

研究发现,当a.txt中最后的光标放在最后一行的下一行时,计算正确。
如果最后的光标跟最后一行是一行,计算结果少一行。
所以  "$"  效果不是很好。

建议,还是把"$" 改成 ".*"

[ 本帖最后由 keen 于 2009-5-6 09:40 编辑 ]
作者: sjzong    时间: 2009-5-6 22:56     标题: 我也来试试

  1. @echo off
  2. for /f "tokens=1 delims=:" %%i in ('findstr /n .* a.txt') do set a=%%i
  3. echo 总行数(包括空行)是:%a%
  4. set/a b=0
  5. for /f "tokens=1 delims=:" %%i in ('findstr /n . a.txt') do set/a b+=1
  6. echo 总行数(扣除空行)是:%b%
  7. pause
复制代码

[ 本帖最后由 sjzong 于 2009-5-6 23:04 编辑 ]
作者: sjzong    时间: 2009-5-6 23:25     标题: 回复 16楼 的帖子

find /c /v "" :将显示不包含指定字符串的行数。指定字符串为分号内的内容,(这边""我认为是空的,不知这样认为行吗?)
例如:find /c /v "a"  是计算不包括字符a的行的总数
假设有a.txt文件,内容如下:
acbda
dendf
sdds
a
b
de
运行命令 find /c /v "a" a.txt
结果:4
运行命令 find /c /v "d" a.txt
结果:2

[ 本帖最后由 sjzong 于 2009-5-6 23:36 编辑 ]
作者: wq1282    时间: 2009-6-29 12:18

原帖由 plp626 于 2008-6-11 19:10 发表
文件非空行数:
findstr/n . list.txt|find /c /v ""
文件总行数(包括空行):
type list.txt|find /c /v ""

文件非空行数:
复制内容到剪贴板代码:
findstr/n . list.txt|find /c /v ""文件总行数(包括空行):
复制内容到剪贴板代码:
type list.txt|find /c /v ""很强
作者: lovelymorning    时间: 2009-6-29 16:09

findstr /xvn .* a.txt

for /f "delims=:" %%a in ('findstr /xvn .* a.txt') do (echo 总有:%%a行)




find /c /v /n "" a.txt
for /f "tokens=2 delims=:" %%a in ('find /c /v /n "" a.txt') do (echo 总有:%%a行)

[ 本帖最后由 lovelymorning 于 2009-6-29 16:12 编辑 ]
作者: johnson3333    时间: 2009-7-2 15:17

  1. ::批处理计算一文本文件的行数
  2. @echo off
  3. set /a count=0
  4. for /f "delims=" %%a in (list.txt) do (if "%%a" neq "" set /a count+=1)
  5. echo;%count%
  6. pause
复制代码
关于空行部分不知道怎么判断。这样弄出来要多一个空行,不知道为什么。

[ 本帖最后由 johnson3333 于 2009-7-2 15:22 编辑 ]
作者: kevinpeng    时间: 2009-8-15 16:13

总行数(包含空行):
  1. findstr  .* list.txt |find /c /v ""
复制代码

作者: poxi    时间: 2010-7-19 22:25

答:
是不是这样
  1. @echo off
  2. for /f " delims=:" %%i in ('findstr /n .* "a.txt"') do set /a h+=1
  3. echo %h%
  4. pause
复制代码


============
end;




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2