Board logo

标题: [文本处理] [已解决]以下批处理如何实现删除最后一行的空行? [打印本页]

作者: Dana    时间: 2011-10-17 09:20     标题: [已解决]以下批处理如何实现删除最后一行的空行?

多谢 xudaweb 帮助, 以下代码如何实现删除最后一行的空行?  原始文件见附件, ( 需要处理最后的空行)

代码的作用是批量提取txt 文件中的前25行, 并且覆盖原文件. 但是修改后, 实际需要25行, 但是脚本由于echo输出将会输出26行, 最后一行为空行, 想在原有的基础上删除最后一行的空行.

是否是曾加一个判断?   if !Line! equ !N! set /p 后面的不会写了......echo,!Var:*:=!
  1. @echo off
  2. set N=25
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! leq !N! echo,!Var:*:=!
  12.         EndLocal
  13.     )
  14. ) > %1
  15. del "%temp%\tmp"
复制代码

作者: FOR    时间: 2011-10-17 10:52

  1. @echo off
  2. set N=25
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if defined flag echo,
  12.         if !Line! leq !N! set /p=!Var:*:=!
  13.         EndLocal
  14.         set flag=a
  15.     )
  16. )<nul> %1
  17. del "%temp%\tmp"
复制代码

作者: Dana    时间: 2011-10-17 11:08

回复 2# FOR


多谢For的及时回复, 已经测试, 脚本不能删除最后一行的空行, 反而在最后一行空行的基础上, 增加了24个空行.

也就是, 原来的文本我提取了25行, 但是26行为空行, 需要只删除26行(最后一行)的空行, 脚本运行后, 整个文档变为了50行.
作者: hankerer    时间: 2011-10-17 12:17

回复  FOR


多谢For的及时回复, 已经测试, 脚本不能删除最后一行的空行, 反而在最后一行空行的基础上, ...
Dana 发表于 2011-10-17 11:08
  1. @echo off
  2. set N=25
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! lss !N! echo,!Var:*:=!
  12.         if !Line! == !N! set /p =!Var:*:=!<nul
  13. EndLocal
  14.     )
  15. ) >> %1
  16. del "%temp%\tmp"
  17. pause
复制代码

作者: FOR    时间: 2011-10-17 12:25

回复 3# Dana

大意了,
  1. @echo off
  2. set N=25
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! leq !N! (
  12.          if defined flag echo,
  13.          set /p=!Var:*:=!
  14.         )
  15.         EndLocal
  16.         set flag=a
  17.     )
  18. )<nul>%1
  19. del "%temp%\tmp"
复制代码

作者: Dana    时间: 2011-10-17 12:53

回复 5# FOR

文档原本第一行是个空行, 执行后发现出现了两个空行....
作者: Dana    时间: 2011-10-17 13:00

回复 4# hankerer


感谢 hankerer  的回复, 测试后发现最后一行的空格是删除了, 但是脚本又将原25行的内容重新拷贝了一次, 文档变为了50行.
作者: FOR    时间: 2011-10-17 13:26

回复 6# Dana

我这里没问题,方便把你的测试样本发上来看看吗。
作者: hankerer    时间: 2011-10-17 13:29

回复  hankerer


感谢 hankerer  的回复, 测试后发现最后一行的空格是删除了, 但是脚本又将原25行的内 ...
Dana 发表于 2011-10-17 13:00
  1. @echo off
  2. set N=25
  3. if not exist %1 exit
  4. if not defined N exit
  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! lss !N! echo,!Var:*:=!
  12.         if !Line! == !N! set /p =!Var:*:=!<nul
  13.                 EndLocal
  14.     )
  15. ) > %1
  16. del "%temp%\tmp"
  17. pause
复制代码
失误,把>多写了一个。

不过我只是提供一个不输出空行的思路
if !Line! == !N! set /p =!Var:*:=!<nul
作者: FOR    时间: 2011-10-17 13:48

本帖最后由 FOR 于 2011-10-17 13:50 编辑

回复 10# Dana


我测试仍是正常的
既然你说不行,就再给你个吧
  1. @echo off
  2. if not exist %1 exit
  3. if not defined N exit
  4. set n=25
  5. findstr /n .* %1> "%temp%\tmp"
  6. set /a n-=1
  7. (
  8.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  9.         set Var=%%a
  10.         set /a m+=1
  11.         SetLocal EnableDelayedExpansion
  12.         if !m! leq !N! echo,!Var:*:=!
  13.         for %%j in (!m!) do EndLocal&set "#%%j=%%a"
  14.     )
  15. )>%1
  16. call set /p=%%#%n%:*:=%%<nul>>%1
  17. del "%temp%\tmp"
复制代码

作者: Dana    时间: 2011-10-17 14:00

回复 9# hankerer

是的, 我的思路也是这样的, 判断是否为最后一行, 然后使用 set /p 但是代码怎么改都不对, 谢谢! 已经测试成功.
作者: powerbat    时间: 2011-10-17 14:07

  1. @set @n=0//& cscript.exe -e:jscript "%~f0"& exit/b
  2. f='test.txt';
  3. fso=new ActiveXObject('Scripting.FileSystemObject');
  4. s=fso.OpenTextFile(f).ReadAll();
  5. s=s.replace(/\r\n$/, '');
  6. fso.OpenTextFile(f+'~', 2, true).Write(s);
复制代码

作者: Dana    时间: 2011-10-17 14:37

终于搞清楚 if !Line! == !N! set /p =!Var:*:=!<nul

学习了, 问题已经解决. 多谢 powerbat , FOR , hankerer  帮忙. 谢谢!
作者: xudaweb    时间: 2011-10-17 23:13

本帖最后由 xudaweb 于 2011-10-17 23:25 编辑

学习了,这句好奇妙啊~
  1. set /p =!Var:*:=!<nul
复制代码
想不通啊,set /p后面怎么能直接跟"="号呀??
作者: Batcher    时间: 2011-10-17 23:40

回复 14# xudaweb


set命令的基础用法之一。等号左边可以有变量名,也可以没有,反正都是直接输出。




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