Board logo

标题: 文本内容的拼接 [打印本页]

作者: lotus516     时间: 2006-9-22 06:22    标题: 文本内容的拼接

问题是这样的,有一个文本文件,里而的内容如下
accident
n.意外遭遇,事故;意外(因素)
across
prep.横过,越过;在的对面 ad.横过,穿过
active
adj.活跃的,敏捷的,积极的;在活动中的
advertise
vt.公告,公布;为...做广告 vi.登广告
after
prep.在...以后;在...后面 adv.以后,后来
我怎么才能把它放到另外一个文件中,其内容为:
accident     n.意外遭遇,事故;意外(因素)
across     prep.横过,越过;在的对面 ad.横过,穿过
active     adj.活跃的,敏捷的,积极的;在活动中的
advertise     vt.公告,公布;为...做广告 vi.登广告
after     prep.在...以后;在...后面 adv.以后,后来
看了几个差不多的贴子,想自已搞定,结果弄了一天多也不成!!!
高手谢谢!!!!!

[ Last edited by lotus516 on 2006-9-22 at 07:34 ]
作者: namejm     时间: 2006-9-22 06:59
  可以使用如下代码测试:
@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
  哎,我倒,刚回贴就发现楼主的问题就换了,十分郁闷。

  另外,建议楼主把这个含义模糊的标题改一下,使得别人一眼就能从标题了解到问题的大概内容。

[ Last edited by namejm on 2006-9-22 at 07:15 ]
作者: lotus516     时间: 2006-9-22 07:30    标题: 呵呵,namejm多谢了!!

发完贴后觉得可能用数字代替不能更好说明问题就改成原文了!还是多谢了!!!
作者: vkill     时间: 2006-9-22 07:35
要我的话,我想用 skip 来实现
作者: lotus516     时间: 2006-9-22 07:59    标题: 一个问题不太明白!

set /a mod=!first!%%2
这句是什么意思?这个%%2的变量??
作者: 3742668     时间: 2006-9-22 08:21


  Quote:
『第 4 楼』:  

要我的话,我想用 skip 来实现

用skip太麻烦了,不建议使用。

  Quote:
『第 5 楼』:  一个问题不太明白!

set /a mod=!first!%%2
这句是什么意思?这个%%2的变量??

%%表示除,mod的值为余数。
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (a.txt) do (
    if "!str!" == "" ( set str=%%i
                     ) else (
                             echo !str!    %%i
                             set str=
                            )
    )
pause

作者: vkill     时间: 2006-9-22 08:29
3742668 斑竹的代码看不懂。汗

不过想问下要是取前6行为1行,用skip好吗?
作者: lotus516     时间: 2006-9-22 08:42
3742668 斑竹的代码好强!!!!
学到了,获益非浅!!!!

[ Last edited by lotus516 on 2006-9-22 at 08:45 ]
作者: 3742668     时间: 2006-9-22 08:46


  Quote:
『第 7 楼』:  

3742668 斑竹的代码看不懂。汗

不过想问下要是取前6行为1行,用skip好吗?

取前6行为1行也没必要用skip,那样的话代码量大多了。在启用延迟环境变量后直接从for里面用上一句set str=!str! %%i就可以了:
@echo off
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变量的值为空。(双数行)
作者: namejm     时间: 2006-9-22 08:57
  由于楼主更改了问题的内容,再加上本人临时有事外出,导致我在第二楼的代码修改之后没有经过认真的测试就匆忙贴出来了,其中有不少冗余代码,现在贴一段修正之后的代码,效率应该提升了不少,请楼主测试:
@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

作者: namejm     时间: 2006-9-22 08:59
  3742668版主的代码实在是太简洁了,效率也更高。受教了。
作者: lotus516     时间: 2006-9-22 09:03
3742668 斑竹,7楼的意思应为每六行为一行,再六行为第二行吧,......!9楼的代码好像不能实现六行为一行,而应是所有的为一行吧???
呵呵刚才把楼层都看错了!!!

[ Last edited by lotus516 on 2006-9-22 at 09:33 ]
作者: lotus516     时间: 2006-9-22 09:04
多谢namejm如些热心!!!!!!我去看看!!二楼的代码也行!!!
作者: 3742668     时间: 2006-9-22 09:13


  Quote:
『第 11 楼』:  

  3742668版主的代码实在是太简洁了,效率也更高。受教了。

过奖了,各有各的好,只不过是追求效率与追求扩展性之间的差别罢了。
如果说是前3行合并为一行,你的算法不变,只需要更改判断语句即可,而我的则需要加入一个标志变量,并嵌套一个if语句;如果是前4行合并为一行,你的算法也没有什么大的变化,而我则需要重新写过了。
不过对于批处理来讲,效率和可扩展性之间的平衡点甚难处理,而且批处理脚本在实用中针对性比较强,建议大家尽量多注重效率。
作者: namejm     时间: 2006-9-22 09:27
  如果要实现每6行拼接为一行,剩余的不满6行的也在最后一行显示出来的话,可以在第9楼的代码上稍加改造就可以了,请看下面的代码:
@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

作者: lotus516     时间: 2006-9-22 09:38
楼上的想问一句,!str!与%str%有什么区别?
作者: pengfei     时间: 2006-9-22 09:49
厉害, 学习了~
作者: 3742668     时间: 2006-9-22 10:01

@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
                             if "!flag!" == "6" (
                                                 echo !str!
                                                 set str=
                                                )
                            )
    )
pause
从算法上来看,CPU算加法应该比算15F的除法要快,但是从批处理结构上来看,我的扩展脚本执行的语句比15F所执行的语句要多。所以其实15F的代码应该效率更高。正如我在14F所说,两种方法的长处分别在于效率和扩展性。批处理在处理这二者上还是太极端了,还是建议注重效率。
作者: namejm     时间: 2006-9-22 10:19


  Quote:
Originally posted by lotus516 at 2006-9-22 09:38:
楼上的想问一句,!str!与%str%有什么区别?

  !str!是在启用了延迟的环境变量的情况下使用的变量引用格式,常规情况下,是用百分号对来对变量进行引用的。
作者: pengfei     时间: 2006-9-22 21:07
3742668版主和namejm兄的思路都很独到. 佩服!

3742668版主采用一个条件变量把单数行的字符先赋于变量一, 而在提取到下一行时, 条件变量就不为空, 执行else, 把双数行的字符直接显示出来, 再把条件变量清空, 这样就实现了单数行和双数行的两两合并, 厉害!

而namejm兄第二楼贴出的代码效率是比较低的, 特别在处理的文件比较大时会比较慢, 占用CPU也会很高, 但兄马上想到了用累加记录行数的办法, 不错. 这样效率大大提高. 再把行数除2取余数, 所得余数为0或1, 再执行判断语句把单数行与双数行的字符分别赋给两个变量. 实现了单数行与双数行的两两合并!

看来批处理的灵活性是非常大的, 只有想不到没有做不到. 哈哈~

[ Last edited by pengfei on 2006-9-23 at 01:39 ]
作者: namejm     时间: 2006-9-22 21:19


  Quote:
Originally posted by 3742668 at 2006-9-22 08:21:
%%表示除,mod的值为余数。

  呵呵,版主这个地方的说法有点小错误,批处理的数字运算中,%%表示取余操作,也就是数学上所说的模操作,在命令行窗口下用%来表示,而除法符号是/。
作者: amao     时间: 2007-2-2 19:51
@sed "$!N;s/\n/\t/" test.txt

[ Last edited by amao on 2007-2-3 at 01:49 PM ]