Board logo

标题: [文本处理] 批处理怎样批量截取并追加同目录下的多个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

  1. @echo off & setlocal enabledelayedexpansion
  2. set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
  3. if not exist temp\ md temp
  4. for %%a in (*.txt) do (
  5.    set /a n=0
  6.    for /f "usebackq delims=" %%i in ("%%a") do (
  7.       set /a n+=1
  8.       set .!n!=%%i
  9.     )
  10.     set /a m=n-2,h=m-3,j=0
  11.     for /l %%j in (!h! 1 !m!) do (
  12.        set /a j+=1
  13.        for %%i in (!j!) do echo !#%%i! !.%%j!>>"temp\%%a"
  14.     )
  15. )
  16. start temp
复制代码

作者: hanyeguxing    时间: 2010-4-21 16:02

行首不为:时
  1. @echo off&setlocal enabledelayedexpansion
  2. set "h_1=AAAA:"&set "h_2=BBBB:"&set "h_3=CCCC:"&set "h_4=DDDD:"
  3. for %%i in (*.txt) do (for /f %%j in ('find /c /v "" ^<"%%i"') do set/a a=%%j-6,b=%%j-2,c=0
  4. 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
  5. del /q "%%i"
  6. ren "%%i.h" "%%i")
复制代码

汗,这圈子让我绕的

[ 本帖最后由 hanyeguxing 于 2010-4-21 16:08 编辑 ]
作者: hanyeguxing    时间: 2010-4-21 16:18

  1. @echo off&setlocal enabledelayedexpansion
  2. set "h_1=AAAA:"&set "h_2=BBBB:"&set "h_3=CCCC:"&set "h_4=DDDD:"
  3. 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
  4. 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
  5. del /q "%%i"
  6. 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

  1. @echo off&setlocal enabledelayedexpansion
  2. ::下面设置各行前添加的内容
  3. set "han_1=AAAA:"&set "han_2=BBBB:"&set "han_3=CCCC:"&set "han_4=DDDD:"
  4. ::下面设置各行的截取长度,从第一个字符开始
  5. set/a ye_1=4,ye_2=5,ye_3=3,ye_4=2
  6. for %%i in (*.txt) do (
  7. for /f %%j in ('find /c /v "" ^<"%%i"') do set/a a=%%j-6,b=%%j-2,c=0,d=0
  8. for /f "usebackq delims=" %%j in ("%%i") do (
  9. set "e=%%j"
  10. set/a d+=1
  11. if !d! gtr !a! if !d! leq !b! (
  12. set/a c+=1
  13. call set f=%%ye_!c!%%
  14. >>"%%i.h" call echo.%%han_!c!%%%%e:~0^,!f!%%
  15. )
  16. )
  17. del /q "%%i"
  18. ren "%%i.h" "%%i"
  19. )
复制代码

作者: 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

  1. @echo off & setlocal enabledelayedexpansion
  2. set #1=AAAA&set #2=BBBB&set #3=CCCC&set #4=DDDD
  3. ::下面设置各行的截取长度,从第一个字符开始
  4. set /a h1=2,h2=3,h3=4,h4=5
  5. if not exist temp\ md temp
  6. for %%a in (*.txt) do (
  7.    set /a n=0
  8.    for /f "usebackq delims=" %%i in ("%%a") do (
  9.       set /a n+=1
  10.       set .!n!=%%i
  11.     )
  12.     set /a m=n-2,h=m-3,j=0
  13.     for /l %%j in (!h! 1 !m!) do (
  14.        set /a j+=1
  15.        for %%i in (!j!) do (
  16.           set var=!.%%j!
  17.           for %%y in (!h%%i!) do echo !#%%i!:!var:~0,%%y!>>"temp\%%a"
  18.         )
  19.     )
  20. )
  21. 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://bathome.net./) Powered by Discuz! 7.2