标题: [文本处理] [已解决]批处理如何将批量文本中n个指定字符串之间行数调整为n行 [打印本页]
作者: a000000_82 时间: 2012-9-1 13:33 标题: [已解决]批处理如何将批量文本中n个指定字符串之间行数调整为n行
批处理如何将批量文本中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
初来乍到希望各位大大帮帮忙!!在此先谢谢各位达人~~~
作者: QIAOXINGXING 时间: 2012-9-1 14:30
好吧,我就这水平:- @echo off&SetLocal EnableDelayEdexpansion&cd /d "%~dp0"
-
- set "n=12"
- for /f "delims=" %%a in ('type 11.txt^&echo +++第') do (
- set /a "n-=1"
- set "str=%%a"
- if defined flag if "!str:~0,4!" == "+++第" (
- for /l %%b in (1 1 !n!) do echo;
- set "n=11"
- )
- if not "!str!" == "+++第" echo %%a
- if "!str:~0,4!" == "+++第" set "flag=1"
- )
-
- pause
复制代码
作者: canyuexiaolang 时间: 2012-9-1 16:46
本帖最后由 canyuexiaolang 于 2012-9-1 17:04 编辑
- @echo off & setlocal enabledelayedexpansion & set /a reline=-1
- :-----------------------------------------------------------------------
- set "filename=test.txt"
- rem 设置文件名
- :-----------------------------------------------------------------------
- (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "!filename!"') do (
- echo %%j | find "+" >nul && (set /a _linenum+=1,reline+=1
- set /a neline=!reline!!_linenum!,line=%%i,_temp=neline-line,_temp-=__temp,__temp=_temp
- for /l %%i in (1 1 !_temp!) do echo= & set /a endline+=1)
- echo=%%j & set /a endline+=1)
- set /a end=neline+9-endline
- if !end! lss 0 set /a end=~end
- for /l %%i in (1 1 !end!) do echo=
- )>_!filename!
- echo 完成^^!
- pause>nul
复制代码
最后测试通过
作者: apang 时间: 2012-9-1 18:40
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"
- if "!str:~,4!"=="+++第" set/a m+=1,n=0
- set/a n+=1&set ".!m!_!n!=!str!"
- )
- for /l %%a in (1 1 !m!) do (
- for /l %%b in (1 1 11) do echo,!.%%a_%%b!
- )
- pause
复制代码
作者: canyuexiaolang 时间: 2012-9-1 18:59
回复 4# apang
话说怎么不行...
作者: apang 时间: 2012-9-1 19:22
回复 5# canyuexiaolang
奇怪了,我在Win7下测试可以呀
作者: canyuexiaolang 时间: 2012-9-1 20:10
回复 6# apang
我也是win7...
作者: a000000_82 时间: 2012-9-2 00:39
三个都能用,衷心感谢三位大大的帮忙!
另:可能文本过大,共76500组,现在二个多小时还没有运行完,请问能否将速度调整快些吗?
作者: FOR 时间: 2012-9-7 01:29
- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- set /a h+=1
- if "!str:~0,4!"=="+++第" (
- set m=1
- if !m! equ 1 set /a n=11-h
- set h=0
- if !n! gtr 0 (
- if defined i for /l %%a in (1 1 !n!) do echo;
- set /a m=0,i=0
- )
- )
- echo %%i
- ))>b.txt
- set /a n=10-h
- (for /l %%a in (1 1 !n!) do echo;)>>b.txt
- echo ok
- pause
复制代码
作者: FOR 时间: 2012-9-7 01:50
谈谈看法
2楼兄弟的代码应该是效率最高的设计,但为了能正确处理最后一个 +++第 的组,用了type 导致速度被拉下不知多少倍,估计他事先不知道是海量数据,否则把最后一个组放到for外面来处理就ok了。
3楼代码,用到了findstr 不用说和type一样,效率低下,更甚者还用到了管道、及find 速度应该慢的无法忍受。
4楼代码,虽说没用外部命令也没用管道,可不是在一次for循环中完成的,效率应该也是大打折扣。
光是最后一组for运行的次数就是 76500*11 够受的。估计也是事先不知道要处理的数据量如此巨大。
总的来说,用bat来处理这样的大数据效率都不可能理想,建议用第三方工具,如 gawk 等。。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |