标题: [文件操作] 批处理怎样批量删除多个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
- @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!"=="" (set /a m+=1&goto lo)
- for /f "tokens=1* delims=:" %%c in ('findstr /n .* "%1"') do (
- if !m! lss 80 (if %%c lss !n! echo.%%d >>%%~na_1.txt) else (echo.%%d>>%%~na_1.txt)
- )
复制代码
行与行之间有空行的话就不行了。因为不清楚你的有没有,所以这里生成临时的文件,没有再处理。假设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
- :: 功能:
- :: 处理当前目录下所有 .txt 文件
- :: 1) 删除文件末尾的空行、空格行、制表符行
- :: 2) 如果最后一行不足 80 个字符,则删除
- ::
- :: 思路:
- :: 1) 计算非空行的行数
- :: 2) 用 "findstr /n" 输出到 .tmp
- :: 3) 只计算 .tmp 的非空行的行数,这样就知道哪行是最后一行(非空行)了
-
- @echo off
- rem 统计文件总数
- set /a Total = 0, Finished = 0
- for %%n in (*.txt) do set /a Total += 1
-
- rem 退格符
- set bs=
-
- for /f "delims=" %%F in ('dir /a:-d /b *.txt') do (
- rem 计算非空行的行数
- set /a Lines = 0, Finished += 1
- for /f "usebackq eol=" %%n in ("%%F") do set /a Lines += 1
-
- rem 使空行不丢失
- findstr /n .* "%%F" > .tmp
-
- (
- for /f "tokens=* delims=0123456789" %%L in (.tmp) do (
- rem 不为空行,则对行数进行计数
- for /f "tokens=1,2" %%1 in ("%%L") do (
- if "%%1%%2" neq ":" set /a Lines -= 1
- )
-
- set Str=%%L
- SetLocal EnableDelayedExpansion
- if !Lines! gtr 0 (
- echo,!Str:~1!
- EndLocal
- ) else (
- if !Lines!==0 (
- if "!Str:~80,1!" neq "" echo !Str:~1!
- EndLocal
- set Lines=-1
- ) else (
- EndLocal
- )
- )
- )
- ) > "%%F"
-
- SetLocal EnableDelayedExpansion
- set /p=%bs%已完成 !Finished! 个文件(共 !Total! 个)<nul
- EndLocal
- )
-
- 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文件夹中
未改动过的文件名都以@开头。
未测试。有问题跟帖。
:- @echo off
- md temp
- for %%i in (*.txt) do (
- set "wjm=%%~nxi"
- setlocal enabledelayedexpansion
- for /f "usebackq delims=" %%a in ("!wjm!") do (
- set "var=!num!"
- if defined var >>"temp\!wjm!" echo !var!
- set "num=%%a"
- )
- if not "!var:~79,1!"=="" (
- >>"temp\!wjm!" echo !var!
- ren "temp\!wjm!" "@!wjm!"
- )
- endlocal
- )
- start temp
复制代码
[ 本帖最后由 随风 于 2010-5-29 01:59 编辑 ]
作者: pcl_test 时间: 2016-9-20 11:56
- //&cls&dir /a-d/b *.txt|cscript -nologo -e:jscript "%~f0"&pause&exit
-
- var fso = new ActiveXObject('Scripting.Filesystemobject');
- while(!WSH.StdIn.AtEndOfStream){
- var line = WSH.StdIn.ReadLine();
- var f = fso.OpenTextFile(line, 1);
- var text = f.ReadAll().replace(/\s+$/, '').replace(/\r?\n.{1,79}$/, '');
- f.Close();
- fso.OpenTextFile(line, 2).Write(text);
- }
- WSH.Echo('Done');
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |