中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-22 00:08
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题:整理文本 (新手老鸟都来试试) 查看 6,075 回复 54
楼 主 出题:整理文本 (新手老鸟都来试试) 发表于 2008-07-13 19:51 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
要求:把 a.txt 整理成按句号换行,
即:把没有句号的行和下行拼接,把有句号的行从句号处换行
注意:有可能连续几行都没有句号,也可能一行中有多个句号。
不用考虑特殊字符问题。
当然前提是不能把a.txt所有内容都拼接为一个变量。(因为变量的字符数是有限制的)
看谁的代码最简洁、高效、加分。。!

a.txt 内容如下:

批处理文件(Batch File,简称 BAT文件)是一种在DOS
下最常用的可执行文件。它具有灵活的操纵性,可适应各
种复杂的计算机操作。所谓的批处理,就是按规定的顺序
自动执行若干个指定的DOS命令或程序。
即是把原来一个一个执行的命令汇总起来,成批的执行,而程序文件可
以移植到其它电脑中运行,因此可以大大节省命令反复输
入的繁琐。同时批处理文件还有一些编程的特点
。可以通过扩展参数来灵活的控制程序的执行,所以在日
常工作中非常实用。批处理。bat。cmd。尺有所短。寸有所长。


要求输出如下格式:

批处理文件(Batch File,简称 BAT文件)是一种在DOS 下最常用的可执行文件。

它具有灵活的操纵性,可适应各种复杂的计算机操作。

所谓的批处理,就是按规定的顺序自动执行若干个指定的DOS命令或程序。

即是把一个一个执行的命令汇总起来成批的执行,而程序文件可以移植到其它电脑中运行,因此可以大大节省命令反复输入的繁琐。

同时批处理文件还有一些编程的特点。

可以通过扩展参数来灵活的控制程序的执行,所以在日常工作中非常实用。

批处理。

bat。

cmd。

尺有所短。

寸有所长。


总结一下:
答案众多,(2楼 14楼 17楼 19楼)
2楼采取逐字读取的办法,且可以处理大多数特殊字符,但效率太低。
14楼创建一个com文件、效率高的惊人。可惜我不懂、倒是长了见识。不过此题目的还是用纯p来解决。
17楼、19楼思路一样、代码略有不同,效率也不错、基本符合楼主要求。


[ Last edited by 26933062 on 2008-7-13 at 10:55 PM ]
致精致简!
2 发表于 2008-07-13 20:18 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
逐字读取

@echo off
for /f "delims=" %%i in ('findstr /n .* 1.txt') do (
set "str=%%i"
setlocal enabledelayedexpansion
set str=!str:*:=!
call :lp
endlocal
)
pause&exit
:lp
if defined str (
set /p= !str:~0,1!<nul
if "!str:~0,1!"=="。" echo.
set str=!str:~1!
goto lp
)

不考虑特殊字符 也可以简化下

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do set str=%%i&call :lp
pause&exit
:lp
set /p= !str:~0,1!<nul
if "!str:~,1!"=="。" echo.
set str=!str:~1!
if defined str goto lp


[ Last edited by terse on 2008-7-13 at 08:23 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
26933062 +5 2008-07-13 20:22
简单!简单!再简单!
3 发表于 2008-07-13 20:21 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
逐字读取不失为一个办法,但效率就大打折扣了。
加 5 分。
致精致简!
4 发表于 2008-07-13 20:29 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
我想法把。换成echo. 可以吗
简单!简单!再简单!
5 要是用vbs就easy了……bat字符处理就看大家啦 发表于 2008-07-13 20:37 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
即是把原来一个一个执行的命令汇总起来,成批的执行,而程序文件可
以移植到其它电脑中运行,因此可以大大节省命令反复输
入的繁琐。



即是把原来一个一个执行的命令汇总起来,成批的执行,而程序文件可以移植到其它电脑中
运行,因此可以大大节省命令反复输入的繁琐。



这个的断句又是如何决定的呢?
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
6 发表于 2008-07-13 20:58 ·  中国 江苏 苏州 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
23年会员
UID 881
性别 男
来自 江苏
状态 离线
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (text.txt) do (
set str=%%i
set/p=!str!<nul>>temp.txt)
for /f "delims=。" %%i in (temp.txt) do (echo %%i。&echo.)>>result.txt


可惜事与愿违, 最后的结果只有一行,高手帮我修改下。思路我认为是对的。
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
7 发表于 2008-07-13 21:22 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
老土兄有没有研究过文本文件一行最多容纳多少个字符?超过这个极限,你的思路还正确吗?
8 发表于 2008-07-13 21:44 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
回 5 楼
即是把原来一个一个执行的命令汇总起来,成批的执行,而程序文件可以移植到其它电脑中运行,因此可以大大节省命令反复输入的繁琐。
这里中间没有句号,当然要算一句了。
致精致简!
9 发表于 2008-07-13 21:52 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
这样可以吗。。。
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do set str=!str!%%a
set str=%str:。=。^&echo.^&echo.%
echo %str%
pause>nul


不好意思,忘记详细看题了。。。

[ Last edited by pusofalse on 2008-7-13 at 09:56 PM ]
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
10 发表于 2008-07-13 21:54 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
那就是排版的问题?我就是不明白为什么在中字断开。。。


如果是vbs的话:replace "回车"为"空",replace "。"为 "。+回车"
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
11 to 9楼 发表于 2008-07-13 21:54 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
楼主不允许这样做啊,呵呵。
12 发表于 2008-07-13 21:55 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
Unix下这样写应该可以成功,但Windows下就是不行,思考中。。。
sed "s/。/。\n/g" a.txt | sed "/。$/!s/\n//g"
13 发表于 2008-07-13 21:59 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
Originally posted by slore at 2008-7-13 21:54:
那就是排版的问题?我就是不明白为什么在中字断开。。。


如果是vbs的话:replace "回车"为"空",replace "。"为 "。+回车"

并没有在“中”字断开,是论坛自动给它换行了。
所以我的样本中都是用空行代表换行的。这样说明白了么?
致精致简!
14 发表于 2008-07-13 22:01 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
换个思路


@echo off
chcp 437 >nul & graftabl 936 >nul
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sbs2.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sbs2.com
echo ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>>sbs2.com
echo iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>>sbs2.com
echo LZp{xq`Cs?H











本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
26933062 +15 2008-07-13 22:15
15 ;回10楼 发表于 2008-07-13 22:01 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
19年会员
UID 59307
状态 离线
我觉得可能是记事本的BUG,有时用的好好的,关闭再打开时记事本就会出现中间断开的情况。
┌───────┐
├→学习→实践→┤
└───────┘
论坛跳转: