Board logo

标题: [文件操作] 批处理怎样批量删除多个txt文本字符数少于指定数值的最后一行? [打印本页]

作者: zxzl    时间: 2010-5-26 23:34     标题: 批处理怎样批量删除多个txt文本字符数少于指定数值的最后一行?

本帖最后由 pcl_test 于 2016-9-20 11:33 编辑

假设一个文件夹下有很多TXT文件,但是部分文件的最后一行很短,现在想将这部分删除,批处理该怎样实现下列功能呢?

1、遍历当前文件夹下所有TXT文件,判断每个TXT文件末尾是否存在空格或回车(可能有多个),如果有的话先将回车或空格删除。

2、判断每个TXT文件的最后一行是否超过80字符(包括空格符),如果少于80字符,就将最后一行删除,如果多于80字符,则不进行操作。
作者: sgaizxt001    时间: 2010-5-27 00:34

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do call :lp "%%a"
  4. pause
  5. exit
  6. :lp
  7. for /f "usebackq delims=" %%b in (%1) do set /a n+=1 &set str=%%b
  8. :lo
  9. if not "!str:~%m%,1!"=="" (set /a m+=1&goto lo)
  10. for /f "tokens=1* delims=:" %%c in ('findstr /n .* "%1"') do (
  11.    if !m! lss 80 (if %%c lss !n! echo.%%d >>%%~na_1.txt) else (echo.%%d>>%%~na_1.txt)
  12. )
复制代码
行与行之间有空行的话就不行了。因为不清楚你的有没有,所以这里生成临时的文件,没有再处理。假设a.txt那么生成的是a_1.txt

[ 本帖最后由 sgaizxt001 于 2010-5-27 06:42 编辑 ]
作者: zxzl    时间: 2010-5-27 08:15

老兄这个代码不能用啊,生成了一大堆临时文件,而且文件本身没有任何改变


原帖由 sgaizxt001 于 2010-5-27 00:34 发表
@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do call :lp "%%a"
pause
exit
:lp
for /f "usebackq delims=" %%b in (%1) do set /a n+=1 &set str=%%b
:lo
if not "!str:~%m%,1!"=="" ( ...

[ 本帖最后由 zxzl 于 2010-5-27 08:16 编辑 ]
作者: sgaizxt001    时间: 2010-5-27 09:10

你先看看临时文件合不合你的要求。对应着去文件名看。
如果合要求的话就是del+ren就可以了的。因为我不知道你的文件构成格式是怎样。如果有的行与行之间没有空行,有的有空行的话,很难处理

[ 本帖最后由 sgaizxt001 于 2010-5-27 09:17 编辑 ]
作者: zxzl    时间: 2010-5-27 09:25

原帖由 sgaizxt001 于 2010-5-27 09:10 发表
你先看看临时文件合不合你的要求。对应着去文件名看。
如果合要求的话就是del+ren就可以了的。因为我不知道你的文件构成格式是怎样。如果有的行与行之间没有空行,有的有空行的话,很难处理


临时文件的内容不对,最麻烦的是一个TXT文件竟然会生成近30个临时文件…

[ 本帖最后由 zxzl 于 2010-5-27 09:40 编辑 ]
作者: del    时间: 2010-5-27 18:46

  1. :: 功能:
  2. ::     处理当前目录下所有 .txt 文件
  3. ::     1) 删除文件末尾的空行、空格行、制表符行
  4. ::     2) 如果最后一行不足 80 个字符,则删除
  5. ::
  6. :: 思路:
  7. ::     1) 计算非空行的行数
  8. ::     2) 用 "findstr /n" 输出到 .tmp
  9. ::     3) 只计算 .tmp 的非空行的行数,这样就知道哪行是最后一行(非空行)了
  10. @echo off
  11. rem 统计文件总数
  12. set /a Total = 0, Finished = 0
  13. for %%n in (*.txt) do set /a Total += 1
  14. rem 退格符
  15. set bs=
  16. for /f "delims=" %%F in ('dir /a:-d /b *.txt') do (
  17.     rem 计算非空行的行数
  18.     set /a Lines = 0, Finished += 1
  19.     for /f "usebackq eol=" %%n in ("%%F") do set /a Lines += 1
  20.     rem 使空行不丢失
  21.     findstr /n .* "%%F" > .tmp
  22.     (
  23.         for /f "tokens=* delims=0123456789" %%L in (.tmp) do (
  24.             rem 不为空行,则对行数进行计数
  25.             for /f "tokens=1,2" %%1 in ("%%L") do (
  26.                 if "%%1%%2" neq ":" set /a Lines -= 1
  27.             )
  28.             set Str=%%L
  29.             SetLocal EnableDelayedExpansion
  30.             if !Lines! gtr 0 (
  31.                 echo,!Str:~1!
  32.                 EndLocal
  33.             ) else (
  34.                 if !Lines!==0 (
  35.                     if "!Str:~80,1!" neq "" echo !Str:~1!
  36.                     EndLocal
  37.                     set Lines=-1
  38.                 ) else (
  39.                     EndLocal
  40.                 )
  41.             )
  42.         )
  43.     ) > "%%F"
  44.     SetLocal EnableDelayedExpansion
  45.     set /p=%bs%已完成 !Finished! 个文件(共 !Total! 个)<nul
  46.     EndLocal
  47. )
  48. del .tmp
复制代码

[ 本帖最后由 del 于 2010-5-31 13:28 编辑 ]
作者: zxzl    时间: 2010-5-27 19:04

这个代码试了一下,基本没什么改变,末尾的空行和回车还在,少于80字符的最后一行也在,只是最后一行和倒数第二行之间的空行没了:(
作者: del    时间: 2010-5-27 19:06     标题: 回复 7楼 的帖子

我修改过几次帖子,请重新测试
作者: zxzl    时间: 2010-5-27 19:12

于 2010-5-27 18:56 编辑

我就是用最新的代码测试的
作者: del    时间: 2010-5-27 19:15     标题: 回复 9楼 的帖子

怎么我测试正常呢...可否传一个样本?

[ 本帖最后由 del 于 2010-5-27 19:17 编辑 ]
作者: sgaizxt001    时间: 2010-5-27 19:43

同楼上,看看你的文本样本,生成30多个临时文件的话就问题大了,不过我的代码我自己测试是可以的
作者: 随风    时间: 2010-5-29 01:57

因楼主未对文本内容作特别说明
所以
未考虑文本中含半角 ! 号的情况
新文件会删除源文件中所有的空行及以半角分号开头的行
代码不对源文件作任何改动,新文件在temp文件夹中
未改动过的文件名都以@开头。
未测试。有问题跟帖。
:
  1. @echo off
  2. md temp
  3. for %%i in (*.txt) do (
  4.    set "wjm=%%~nxi"
  5.    setlocal enabledelayedexpansion
  6.    for /f "usebackq delims=" %%a in ("!wjm!") do (
  7.       set "var=!num!"
  8.       if defined var >>"temp\!wjm!" echo !var!
  9.       set "num=%%a"
  10.     )
  11.     if not "!var:~79,1!"=="" (
  12.        >>"temp\!wjm!" echo !var!
  13.        ren "temp\!wjm!" "@!wjm!"
  14.     )
  15.     endlocal
  16. )
  17. start temp
复制代码

[ 本帖最后由 随风 于 2010-5-29 01:59 编辑 ]
作者: pcl_test    时间: 2016-9-20 11:56

  1. //&cls&dir /a-d/b *.txt|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var fso = new ActiveXObject('Scripting.Filesystemobject');
  3. while(!WSH.StdIn.AtEndOfStream){
  4.     var line = WSH.StdIn.ReadLine();
  5.     var f = fso.OpenTextFile(line, 1);
  6.     var text = f.ReadAll().replace(/\s+$/, '').replace(/\r?\n.{1,79}$/, '');
  7.     f.Close();
  8.     fso.OpenTextFile(line, 2).Write(text);
  9. }
  10. WSH.Echo('Done');
复制代码





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