标题: [文本处理] 批处理怎样批量截取并追加同目录下的多个TXT文件的内容? [打印本页]
作者: zzh106 时间: 2010-4-21 14:07 标题: 批处理怎样批量截取并追加同目录下的多个TXT文件的内容?
第一次提问,没看版规,不敢要求太多,
发现高手如云,就把我的想法及要求一次给说出来,麻烦给做一下。
批量操作文本内容的指定行往上的4行内容并以原文件名保存
不需要生成备份,最主要就是不能把文件名给改了,还是保存到原来的那个文件名里面,
然后再给这四行的内容的前面追加对应的字符
具体效果如下:
原始文本内容如下
格式为ANSI,就是数字和英文字符,无中文,倒数上来的那6行内无空行。
.......
.......
........上面有很多行....
000000000000000
111111111111111
222222222222222
333333333333333
444444444444444
555555555555555
666666666666666
777777777777777
888888888888888
999999999999999
截取倒数第二行以上的四行文本内容,
再在第一行内容添加:AAAA:
第二行内容添加:BBBB:
第三行内容添加:CCCC:
第四行内容添加:EEEE:
AAAA:444444444444444
BBBB:555555555555555
CCCC:666666666666666
DDDD:777777777777777
就是想得到上面的这个内容。
再加一点要求,就是截取的这四行,每行截取的长度要是都可设置就完美了。(这四行分别截取N1 ,N2, N3, N4字符)最后再把TXT的名件名(不要复扩展名)复制到最后一行。
比如下面这样的效果:
AAAA:4444444444 (N1)
BBBB:555555555555 (N2)
CCCC:666666666666 (N3)
DDDD:7777777777777 (N4)
TXT文件名
[ 本帖最后由 zzh106 于 2010-4-22 11:23 编辑 ]
作者: hanyeguxing 时间: 2010-4-21 15:02
1,版规是要看滴
2,你没说明文本的编码类型和是否含或含什么样的敏感字符?
3,你没说明是否保留空行
4,你没说明是否直接对原文件进行修改
5,批量操作,是不是有多个文本要这样操作?
作者: zzh106 时间: 2010-4-21 15:17
1,刚又看了一遍
2.编码类型是ANSI,内容就是普通的数字,英文,无敏感字符,中文都没有。
3.“那4行都是有字的,没空行
4,可以直接对文件修改,反正我是有备份的,文件名不动,
5。批量操作,目录下的所有TXT文件,不止一个。
谢谢。
作者: 随风 时间: 2010-4-21 15:43
- @echo off & setlocal enabledelayedexpansion
- set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
- if not exist temp\ md temp
- for %%a in (*.txt) do (
- set /a n=0
- for /f "usebackq delims=" %%i in ("%%a") do (
- set /a n+=1
- set .!n!=%%i
- )
- set /a m=n-2,h=m-3,j=0
- for /l %%j in (!h! 1 !m!) do (
- set /a j+=1
- for %%i in (!j!) do echo !#%%i! !.%%j!>>"temp\%%a"
- )
- )
- start temp
复制代码
作者: hanyeguxing 时间: 2010-4-21 16:02
行首不为:时- @echo off&setlocal enabledelayedexpansion
- set "h_1=AAAA:"&set "h_2=BBBB:"&set "h_3=CCCC:"&set "h_4=DDDD:"
- for %%i in (*.txt) do (for /f %%j in ('find /c /v "" ^<"%%i"') do set/a a=%%j-6,b=%%j-2,c=0
- for /f "tokens=1* delims=:" %%j in ('findstr /n .* "%%i"') do if %%j gtr !a! if %%j leq !b! set/a c+=1&>>"%%i.h" call echo.%%h_!c!%%%%k
- del /q "%%i"
- ren "%%i.h" "%%i")
复制代码
汗,这圈子让我绕的
[ 本帖最后由 hanyeguxing 于 2010-4-21 16:08 编辑 ]
作者: hanyeguxing 时间: 2010-4-21 16:18
- @echo off&setlocal enabledelayedexpansion
- set "h_1=AAAA:"&set "h_2=BBBB:"&set "h_3=CCCC:"&set "h_4=DDDD:"
- for %%i in (*.txt) do (for /f %%j in ('find /c /v "" ^<"%%i"') do set/a a=%%j-6,b=%%j-2,c=0,d=0
- for /f "usebackq delims=" %%j in ("%%i") do set/a d+=1&if !d! gtr !a! if !d! leq !b! set/a c+=1&>>"%%i.h" call echo.%%h_!c!%%%%j
- del /q "%%i"
- ren "%%i.h" "%%i")
复制代码
[ 本帖最后由 hanyeguxing 于 2010-4-21 16:20 编辑 ]
作者: zzh106 时间: 2010-4-21 16:21
原帖由 随风 于 2010-4-21 15:43 发表
@echo off & setlocal enabledelayedexpansion
set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
if not exist temp\ md temp
for %%a in (*.txt) do (
set /a n=0
for /f "usebackq delims=" %%i in (" ...
感谢感谢!
刚运行了一下,就是AAAA,BBBB,CCCC,DDDD后面多了一个空格,其它都正常
而且自动生成一个TEMP的目录,真好!
作者: zzh106 时间: 2010-4-21 16:28
原帖由 hanyeguxing 于 2010-4-21 16:02 发表
行首不为:时@echo off&setlocal enabledelayedexpansion
set "h_1=AAAA:"&set "h_2=BBBB:"&set "h_3=CCCC:"&set "h_4=DDDD:"
for %%i in (*.txt) do (for /f %%j in ('find /c /v "" ^>"%%i.h" call echo.%%h_!c!% ...
谢谢。达到预期效果。
作者: 随风 时间: 2010-4-21 16:45
空格是特意加的,为了方便检查
你自己改下就行了
echo !#%%i! !.%%j!>>"temp\%%a"
改为
echo !#%%i!!.%%j!>>"temp\%%a"
最初思路和 寒夜孤星 的一样,用 find 先获取总行数,但楼主要求是批量处理,且又以声明无空行,考虑效率问题,还是放弃了 find
另:能给 孤星 兄提个建议么?
以后写代码能否也讲究下书写格式,方便阅读啊,这样看你代码真有点累哦 ^_^
作者: hanyeguxing 时间: 2010-4-21 16:51 标题: 回复 9楼 的帖子
陋习马上就改,嘿嘿...
作者: zzh106 时间: 2010-4-21 17:00
原帖由 随风 于 2010-4-21 16:45 发表
空格是特意加的,为了方便检查
你自己改下就行了
echo !#%%i! !.%%j!>>"temp\%%a"
改为
echo !#%%i!!.%%j!>>"temp\%%a"
最初思路和 寒夜孤星 的一样,用 find 先获取总行数,但楼主要求是批量处理,且又以声明无 ...
AAAA: BBBB:后面都没有内容了啊
作者: zzh106 时间: 2010-4-21 17:14
我把难度又提高了些,麻烦二位老大,再给看盾
作者: hanyeguxing 时间: 2010-4-21 17:25
但你没说这四行要求截取的长度是多少啊?
ps:表用红色字体!重点内容加粗就可以了
作者: zzh106 时间: 2010-4-21 17:36
原帖由 hanyeguxing 于 2010-4-21 17:25 发表
但你没说这四行要求截取的长度是多少啊?
ps:表用红色字体!重点内容加粗就可以了
我想要活动的,想截多长就多长。
直接在BAT里面改一下就OK的那种。
这样是不要线好多圈啊
作者: hanyeguxing 时间: 2010-4-21 17:57
- @echo off&setlocal enabledelayedexpansion
- ::下面设置各行前添加的内容
- set "han_1=AAAA:"&set "han_2=BBBB:"&set "han_3=CCCC:"&set "han_4=DDDD:"
- ::下面设置各行的截取长度,从第一个字符开始
- set/a ye_1=4,ye_2=5,ye_3=3,ye_4=2
- for %%i in (*.txt) do (
- for /f %%j in ('find /c /v "" ^<"%%i"') do set/a a=%%j-6,b=%%j-2,c=0,d=0
- for /f "usebackq delims=" %%j in ("%%i") do (
- set "e=%%j"
- set/a d+=1
- if !d! gtr !a! if !d! leq !b! (
- set/a c+=1
- call set f=%%ye_!c!%%
- >>"%%i.h" call echo.%%han_!c!%%%%e:~0^,!f!%%
- )
- )
- del /q "%%i"
- ren "%%i.h" "%%i"
- )
复制代码
作者: zzh106 时间: 2010-4-21 18:29
找不到指定的文件啊。
作者: hanyeguxing 时间: 2010-4-21 18:34
1,批处理要和需要处理的文本放在一个文件夹内
2,15楼的代码测试正常.如果你对原代码进行了修改,检查修改部分是否正确
3,如果还不行,贴出你运行的代码
作者: zzh106 时间: 2010-4-21 18:44
加我QQ吧。
没改代码,怎把目录内的TXT都给删了
作者: 随风 时间: 2010-4-21 20:22
- @echo off & setlocal enabledelayedexpansion
- set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
- ::下面设置各行的截取长度,从第一个字符开始
- set /a h1=2,h2=3,h3=4,h4=5
- if not exist temp\ md temp
- for %%a in (*.txt) do (
- set /a n=0
- for /f "usebackq delims=" %%i in ("%%a") do (
- set /a n+=1
- set .!n!=%%i
- )
- set /a m=n-2,h=m-3,j=0
- for /l %%j in (!h! 1 !m!) do (
- set /a j+=1
- for %%i in (!j!) do (
- set var=!.%%j!
- for %%y in (!h%%i!) do echo !#%%i!:!var:~0,%%y!>>"temp\%%a"
- )
- )
- )
- start temp
复制代码
作者: zzh106 时间: 2010-4-21 21:54
原帖由 随风 于 2010-4-21 20:22 发表
@echo off & setlocal enabledelayedexpansion
set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
::下面设置各行的截取长度,从第一个字符开始
set /a h1=2,h2=3,h3=4,h4=5
if not exist temp\ md temp
for %%a ...
真的是太完美了。。。而且处理速度好快。
能否把文件名,复制到TXT内容的最后一行?
我是不要求太多了啊。呵呵,好像永远满足不了似的。
效果如下:
AAAA:444444444444444
BBBB:555555555555555
CCCC:666666666666666
DDDD:777777777777777
TXT文件名:谢谢啊
[ 本帖最后由 zzh106 于 2010-4-21 21:57 编辑 ]
作者: GNU 时间: 2010-4-21 22:29 标题: 回复 20楼 的帖子
有什么需求能否一次说完?
作者: 随风 时间: 2010-4-21 23:07
这种挤牙膏的提问方式真是可恶
要求多不要紧,关键是你要一次说完,幸好追加的要求对代码变动不大,否则真没人理你。
)
echo %%~nxa>>"temp\%%a"
)
start temp
作者: zzh106 时间: 2010-4-21 23:30
原帖由 随风 于 2010-4-21 23:07 发表
这种挤牙膏的提问方式真是可恶
要求多不要紧,关键是你要一次说完,幸好追加的要求对代码变动不大,否则真没人理你。
)
echo %%~nxa>>"temp\%%a"
)
start temp
老大这个是加到哪个地方?最后吗?
真的是超级完美了,超级感谢。
保证不会再挤了!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |