找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25704|回复: 9

[文本处理] [已解决]批处理如何将批量文本中n个指定字符串之间行数调整为n行

[复制链接]
发表于 2012-9-1 13:33:31 | 显示全部楼层 |阅读模式
批处理如何将批量文本中n个指定字符串之间行数调整为n行

例如:处理前的*.txt内容如下:
+++第01组+++
aaaaaa
aaaaaa
aaaaaa

+++第02组+++
bbbbbb
bbbbbb

+++第03组+++
cccccc
cccccc
cccccc
cccccc

注:每组行数不定....
例如:判断*.txt两个(+++第)之间行数是否够十行,如果不够,则在下面用空行补足十行.....
处理后的*.txt内容如下:
+++第01组+++
aaaaaa
aaaaaa
aaaaaa







+++第02组+++
bbbbbb
bbbbbb








+++第03组+++
cccccc
cccccc
cccccc
cccccc






初来乍到希望各位大大帮帮忙!!在此先谢谢各位达人~~~

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-9-1 14:30:29 | 显示全部楼层
好吧,我就这水平:
  1. @echo off&SetLocal EnableDelayEdexpansion&cd /d "%~dp0"

  2. set "n=12"
  3. for /f "delims=" %%a in ('type 11.txt^&echo +++第') do (
  4.   set /a "n-=1"
  5.   set "str=%%a"
  6.   if defined flag if "!str:~0,4!" == "+++第" (
  7.     for /l %%b in (1 1 !n!) do echo;
  8.     set "n=11"
  9.   )
  10.   if not "!str!" == "+++第" echo %%a
  11.   if "!str:~0,4!" == "+++第" set "flag=1"
  12. )

  13. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2012-9-1 16:46:51 | 显示全部楼层
本帖最后由 canyuexiaolang 于 2012-9-1 17:04 编辑
  1. @echo off & setlocal enabledelayedexpansion & set /a reline=-1
  2. :-----------------------------------------------------------------------
  3. set "filename=test.txt"
  4. rem 设置文件名
  5. :-----------------------------------------------------------------------
  6. (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "!filename!"') do (
  7.       echo %%j | find "+" >nul && (set /a _linenum+=1,reline+=1
  8.           set /a neline=!reline!!_linenum!,line=%%i,_temp=neline-line,_temp-=__temp,__temp=_temp
  9.           for /l %%i in (1 1 !_temp!) do echo= & set /a endline+=1)
  10.       echo=%%j & set /a endline+=1)
  11.   set /a end=neline+9-endline
  12.   if !end! lss 0 set /a end=~end
  13.   for /l %%i in (1 1 !end!) do echo=
  14. )>_!filename!
  15. echo 完成^^!
  16. pause>nul
复制代码

最后测试通过

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2012-9-1 18:40:18 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.   set "str=%%a"
  4.   if "!str:~,4!"=="+++第" set/a m+=1,n=0
  5.   set/a n+=1&set ".!m!_!n!=!str!"
  6. )
  7. for /l %%a in (1 1 !m!) do (
  8.   for /l %%b in (1 1 11) do echo,!.%%a_%%b!
  9. )
  10. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2012-9-1 18:59:28 | 显示全部楼层
回复 4# apang

话说怎么不行...
发表于 2012-9-1 19:22:57 | 显示全部楼层
回复 5# canyuexiaolang

奇怪了,我在Win7下测试可以呀
发表于 2012-9-1 20:10:13 | 显示全部楼层
回复 6# apang
我也是win7...
 楼主| 发表于 2012-9-2 00:39:01 | 显示全部楼层
三个都能用,衷心感谢三位大大的帮忙!

另:可能文本过大,共76500组,现在二个多小时还没有运行完,请问能否将速度调整快些吗?
发表于 2012-9-7 01:29:13 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (a.txt) do (
  3.         set "str=%%i"
  4.         set /a h+=1
  5.         if "!str:~0,4!"=="+++第" (
  6.                 set m=1
  7.                 if !m! equ 1 set /a n=11-h
  8.                 set h=0
  9.                 if !n! gtr 0 (
  10.                         if defined i for /l %%a in (1 1 !n!) do echo;
  11.                         set /a m=0,i=0
  12.                 )       
  13.         )
  14.         echo %%i
  15. ))>b.txt
  16. set /a n=10-h
  17. (for /l %%a in (1 1 !n!) do echo;)>>b.txt
  18. echo ok
  19. pause



复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2012-9-7 01:50:26 | 显示全部楼层
谈谈看法
2楼兄弟的代码应该是效率最高的设计,但为了能正确处理最后一个 +++第 的组,用了type 导致速度被拉下不知多少倍,估计他事先不知道是海量数据,否则把最后一个组放到for外面来处理就ok了。

3楼代码,用到了findstr 不用说和type一样,效率低下,更甚者还用到了管道、及find 速度应该慢的无法忍受。

4楼代码,虽说没用外部命令也没用管道,可不是在一次for循环中完成的,效率应该也是大打折扣。
光是最后一组for运行的次数就是 76500*11 够受的。估计也是事先不知道要处理的数据量如此巨大。

总的来说,用bat来处理这样的大数据效率都不可能理想,建议用第三方工具,如 gawk 等。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 16:47 , Processed in 0.017690 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表