dos命令大全 应用之拼接文本内容
dos吧
全部回复
仅看楼主
level 5
edit98 楼主
问题是这样的,有一个文本文件,里而的内容如下
accident
n.意外遭遇,事故;意外(因素)
across
prep.横过,越过;在的对面 ad.横过,穿过
active
adj.活跃的,敏捷的,积极的;在活动中的
advertise
vt.公告,公布;
after
prep.在...以后;在...后面 adv.以后,后来
我怎么才能把它放到另外一个文件中,其内容为:
accident      n.意外遭遇,事故;意外(因素)
across      prep.横过,越过;在的对面 ad.横过,穿过
active      adj.活跃的,敏捷的,积极的;在活动中的
advertise      vt.公告,公布;为...做广告 vi.登广告
after      prep.在...以后;在...后面 adv.以后,后来
看了几个差不多的贴子,想自已搞定,结果弄了一天多也不成!!!
高手谢谢!!!!!
可以使用如下代码测试:CODE:   Copy to clipboard@echo off
setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n . test.txt') do (
     set first=!second!
     set second=%%i
     if not "!first!"=="" set /a mod=!first!%%2
     if !mod! equ 1 (set var=%%j) else (set str=%%j)
     if !mod! equ 1 echo !str!     !var!
)
pause
     哎,我倒,刚回贴就发现楼主的问题就换了,十分郁闷。
     另外,建议楼主把这个含义模糊的标题改一下,使得别人一眼就能从标题了解到问题的大概内容。
set /a mod=!first!%%2
这句是什么意思?这个%%2的变量??
%%表示除,mod的值为余数。CODE:   Copy to clipboard@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (a.txt) do (
     if "!str!" == "" ( set str=%%i
                      ) else (
                              echo !str!     %%i
                              set str=
                             )
     )
pause
取前6行为1行也没必要用skip,那样的话代码量大多了。在启用延迟环境变量后直接从for里面用上一句set str=!str! %%i就可以了:CODE:   Copy to clipboard@echo off

2011年06月19日 14点06分 1
level 5
edit98 楼主
setlocal ENABLEDELAYEDEXPANSION
     for /f "delims=" %%i in (a.txt) do set str=!str! %%i
     echo %str%
     pause
goto :eof
至于6F的代码,你带着算法去看就会觉得很简单了:
若str变量的值为空,则把当前行的内容保存到str中。(单数行)
若str变量的值非空,则打印str变量的内容+空格+当前行的内容,然后更改str变量的值为空。(双数行)
   由于楼主更改了问题的内容,再加上本人临时有事外出,导致我在第二楼的代码修改之后没有经过认真的测试就匆忙贴出来了,其中有不少冗余代码,现在贴一段修正之后的代码,效率应该提升了不少,请楼主测试:CODE:   Copy to dos之家
clipboard@echo off
set /a num=1
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (1.txt) do (
     set /a num+=1
     set /a mod=!num!%%2
     if !mod! equ 1 (set var=%%i) else (set str=%%i)
     if !mod! equ 1 echo !str!     !var!
)
pause
过奖了,各有各的好,只不过是追求效率与追求扩展性之间的差别罢了。
如果说是前3行合并为一行,你的算法不变,只需要更改判断语句即可,而我的则需要加入一个标志变量,并嵌套一个if语句;如果是前4行合并为一行,你的算法也没有什么大的变化,而我则需要重新写过了。
不过对于批处理来讲,效率和可扩展性之间的平衡点甚难处理,而且批处理脚本在实用中针对性比较强,建议大家尽量多注重效率。
如果要实现每6行拼接为一行,剩余的不满6行的也在最后一行显示出来的话,可以在第9楼的代码上稍加改造就可以了,请看下面的代码:CODE:   Copy to clipboard@echo off
set num=0
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (a.txt) do (
     set /a num+=1
     set str=!str! %%i
     if !num! equ 6 echo !str! && set num=0 & set str=
)
if not "%str%"=="" echo %str%
pause
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (a.txt) do (
     if "!str!" == "" ( set str=%%i
                        set flag=1
                      ) else (set /a flag = !flag! + 1
                              set str=!str! %%i

2011年06月19日 14点06分 2
1