|
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 |
|