[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

多谢 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"
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
一书,一隅,一香茗;半梦,半醒,半人生……

  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"
复制代码

TOP

回复 2# FOR


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

也就是, 原来的文本我提取了25行, 但是26行为空行, 需要只删除26行(最后一行)的空行, 脚本运行后, 整个文档变为了50行.
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

回复  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
复制代码

TOP

回复 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"
复制代码
1

评分人数

    • Dana: 乐于助人技术 + 1

TOP

回复 5# FOR

文档原本第一行是个空行, 执行后发现出现了两个空行....
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

回复 4# hankerer


感谢 hankerer  的回复, 测试后发现最后一行的空格是删除了, 但是脚本又将原25行的内容重新拷贝了一次, 文档变为了50行.
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

回复 6# Dana

我这里没问题,方便把你的测试样本发上来看看吗。

TOP

回复  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
1

评分人数

    • Dana: 乐于助人技术 + 1

TOP

本帖最后由 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"
复制代码

TOP

回复 9# hankerer

是的, 我的思路也是这样的, 判断是否为最后一行, 然后使用 set /p 但是代码怎么改都不对, 谢谢! 已经测试成功.
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

  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);
复制代码

TOP

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

学习了, 问题已经解决. 多谢 powerbat , FOR , hankerer  帮忙. 谢谢!
一书,一隅,一香茗;半梦,半醒,半人生……

TOP

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

学习了,这句好奇妙啊~
  1. set /p =!Var:*:=!<nul
复制代码
想不通啊,set /p后面怎么能直接跟"="号呀??
学习...

TOP

回复 14# xudaweb


set命令的基础用法之一。等号左边可以有变量名,也可以没有,反正都是直接输出。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表