中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 文本内容的拼接 上一主题 | 下一主题
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『楼 主』:  文本内容的拼接

问题是这样的,有一个文本文件,里而的内容如下
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 ]

2006-9-22 06:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  可以使用如下代码测试:
@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 ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-22 06:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 3 楼』:  呵呵,namejm多谢了!!

发完贴后觉得可能用数字代替不能更好说明问题就改成原文了!还是多谢了!!!

2006-9-22 07:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 4 楼』:  

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

2006-9-22 07:35
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 5 楼』:  一个问题不太明白!

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

2006-9-22 07:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 6 楼』:  



  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


2006-9-22 08:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 7 楼』:  

3742668 斑竹的代码看不懂。汗

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

2006-9-22 08:29
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 8 楼』:  

3742668 斑竹的代码好强!!!!
学到了,获益非浅!!!!

[ Last edited by lotus516 on 2006-9-22 at 08:45 ]

2006-9-22 08:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 9 楼』:  



  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变量的值为空。(双数行)

2006-9-22 08:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

  由于楼主更改了问题的内容,再加上本人临时有事外出,导致我在第二楼的代码修改之后没有经过认真的测试就匆忙贴出来了,其中有不少冗余代码,现在贴一段修正之后的代码,效率应该提升了不少,请楼主测试:
@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




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-22 08:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 11 楼』:  

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



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-22 08:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 12 楼』:  

3742668 斑竹,7楼的意思应为每六行为一行,再六行为第二行吧,......!9楼的代码好像不能实现六行为一行,而应是所有的为一行吧???
呵呵刚才把楼层都看错了!!!

[ Last edited by lotus516 on 2006-9-22 at 09:33 ]

2006-9-22 09:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lotus516
高级用户

论坛上抢劫的


积分 551
发帖 246
注册 2006-9-21
状态 离线
『第 13 楼』:  

多谢namejm如些热心!!!!!!我去看看!!二楼的代码也行!!!

2006-9-22 09:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 14 楼』:  



  Quote:
『第 11 楼』:  

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

过奖了,各有各的好,只不过是追求效率与追求扩展性之间的差别罢了。
如果说是前3行合并为一行,你的算法不变,只需要更改判断语句即可,而我的则需要加入一个标志变量,并嵌套一个if语句;如果是前4行合并为一行,你的算法也没有什么大的变化,而我则需要重新写过了。
不过对于批处理来讲,效率和可扩展性之间的平衡点甚难处理,而且批处理脚本在实用中针对性比较强,建议大家尽量多注重效率。

2006-9-22 09:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 15 楼』:  

  如果要实现每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




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-22 09:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: