Board logo

标题: [文本处理] 如何判断一个超大文本的最后一行是否为空行 [打印本页]

作者: 随风    时间: 2009-8-25 16:57     标题: 如何判断一个超大文本的最后一行是否为空行

比如a.txt文件很大,假设有几万行,如何比较快速的判断最后一行是否是空行?

[ 本帖最后由 随风 于 2009-8-25 17:07 编辑 ]
作者: tireless    时间: 2009-8-25 18:16

  1. @echo off
  2. for /f %%a in ('^(type a.txt^&echo.^)^|find /c /v ""') do (
  3.     for /f %%b in ('find /c /v "" ^< a.txt') do (
  4.         if "%%a"=="%%b" (echo 不是空行) else echo 空行
  5.     )
  6. )
  7. pause
复制代码
用临时文件速度快一点:
  1. ((type a.txt&echo.)|find /c /v "" & find /c /v ""<a.txt)>.temp
  2. set /p line=<.temp
  3. for /f "skip=1" %%a in (.temp) do (
  4.     if "%%a"=="%line%" (echo 不是空行) else echo 空行
  5. )
  6. del .temp
  7. pause
复制代码

作者: terse    时间: 2009-8-25 19:31

tireless兄 出手真快
  1. @echo off
  2. for /f %%a in ('find/c /v "" ^< a.txt') do (
  3.    for /f %%b in ('"(type a.txt&set/p= <nul)|find/c /v """') do (
  4.    if "%%a" neq "%%b" (echo 最后行是空行)else echo 最后行不是空行
  5. ))
  6. pause
复制代码

作者: 随风    时间: 2009-8-25 19:46

呵呵,对于上万行文本,速度仍是不敢恭维,继续。。。。。
作者: zqz0012005    时间: 2009-8-25 19:58

  1. @echo off
  2. more a.txt>b.txt
  3. fc /l a.txt b.txt >nul && echo 是空行。
  4. for %%a in (a.txt) do for %%i in (b.txt) do if %%~za==%%~zi echo 是空行
  5. rem 可能for速度快点。
复制代码

作者: terse    时间: 2009-8-25 20:55

这样笨点可以不
  1. @echo off
  2. findstr /n .* y1.txt>b1.txt
  3. (type y1.txt&set/p= <nul)>b2.txt
  4. findstr /n .* b2.txt>b3.txt
  5. for %%a in (b3.txt) do for %%b in (b1.txt) do set /a n=%%~za-%%~zb
  6. if %n% gtr 1 (echo 空行)else echo 不是空行
  7. del b1.txt b2.txt b3.txt
  8. pause
复制代码

作者: rat    时间: 2009-8-25 21:41

  1. @echo off
  2. copy /b a.txt a.tmp>nul
  3. echo a>>a.tmp
  4. for /f %%a in ('find /c /v "" ^<a.txt') do ^
  5. for /f %%b in ('find /c /v "" ^<a.tmp') do ^
  6. if %%a==%%b (echo 非空行) else echo 空行
  7. del a.tmp
  8. pause
复制代码

作者: 随风    时间: 2009-8-25 22:47

more 处理6万行以上的文本好像会卡住,需要按空格继续。
find /c /v "" 处理太多的行速度其实也并不快。
继续。。。继续。。。
作者: Batcher    时间: 2009-8-25 23:10

由空格、tab等空白字符组成的行算不算空行?
作者: terse    时间: 2009-8-26 00:11

SORT 好用不?
  1. @echo off
  2. sort a.txt>b.txt
  3. for %%a in (a.txt) do for %%b in (b.txt) do if %%~za equ %%~zb (echo 空行)else echo 不是空行
  4. pause
复制代码

作者: 随风    时间: 2009-8-26 00:28     标题: 回复 9楼 的帖子

不算,

处理2百17万行文本46M,2秒。



[ 本帖最后由 随风 于 2009-8-26 03:01 编辑 ]
作者: pusofalse    时间: 2009-8-26 04:50

  1. @echo off
  2. findstr /v $ test.txt>nul || echo 空行
  3. pause
复制代码

[ 本帖最后由 pusofalse 于 2009-8-26 04:52 编辑 ]
作者: Lumiere    时间: 2009-8-26 12:18     标题: 回复 12楼 的帖子

看代码的意思回车是不是也算行尾?
作者: pusofalse    时间: 2009-8-26 18:27     标题: 回复 13楼 的帖子

这是findstr的一个很实用的技巧。例如如果要计算某文本的行数可以用:
  1. findstr /n /v $ test.txt
复制代码

但这并不适用于最后一行是空行的文本,如何判断最后一行是否为空行,思路就是这样来的。我想随风兄的代码应该也是类似于这句的吧?
作者: 随风    时间: 2009-8-27 20:38     标题: 回复 14楼 的帖子

呵呵,不是类似,是一模一样。。。
又一次证明了findstr如果匹配的结果很少时,速度是很快的。
作者: Lumiere    时间: 2009-8-28 12:45     标题: 回复 14楼 的帖子

没太理解这$行尾是什么意思。是不是只有文本最后一行才能匹配$?

[ 本帖最后由 Lumiere 于 2009-8-28 12:48 编辑 ]




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