中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-08 23:18
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【讨论】一行分成多行 查看 1,775 回复 15
楼 主 【讨论】一行分成多行 发表于 2008-05-31 01:24 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
论坛里不乏多行拼接成一行的,偶数行奇数行拼接的代码
但一行分成多行的代码我至今没发现,我不是指那个for+delims

给个测试样本:

1 86.2;2 90.0;3 87.8;4 83.4;5 88.0;6 84.1;7 83.2;8 80.6;9 74.0;10 73.7;11 71.5;12 72.7;13 70.4;14 75.0;15 72.1;16 80.0;17 75.4;18 83.7;19 87.0;20 88.0;21 85.6;22 81.1;23 90.0;24 88.7;25 89.6;26 86.1;27 75.5;28 81.6;29 80.1;30 88.0;31 72.2;32 77.6;33 80.0;34 72.9;35 72.6;36 70.5;37 78.0;38 69.5;39 72.4;40 72.4;41 74.3;42 74.4;43 80.0;44 88.1;45 88.5;46 90.9;47 94.0;48 89.0;49 94.2;50 97.0;51 90.0;52 95.2;


以分号为分割符把上面的但行分成多行
要求:代码要具有通用性,可以生产临时文件。。。

6楼代码比较符合要求-----echo\替换行标志,很有思想。大家帮我加个分,我每分了。。。
8楼代码把变量用得也不错,很欣赏。。。以后那个shift+goto多行输出可以用for代替了(思想比较像4楼)大家也加个分吧。。。

仔细搜索了下,有类似问题已经被讨论过了,不好意思,算是重复贴了,

http://www.cn-dos.net/forum/viewthread.php?tid=35438单行拆分,里面代码思想只得借鉴。。。。
-----------------------------------------------------
题外话:
如果不是cmd痴迷者,为了目的实现大家确实得学学外部工具了
就这个样本:
用sed是如此地简洁高效:
sed s/;/\n/g a.txt


[ Last edited by plp626 on 2008-5-31 at 02:56 AM ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2 发表于 2008-05-31 01:27 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
说白了就是告诉cmd将“;”当作换行符号

除了set 截取 if 判断";"可有它发?

怎么用换行符替换“;”?
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
3 发表于 2008-05-31 01:31 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线

@echo off
for /f "delims=" %%a in (a.txt) do call :loop "%%a"
pause
:loop
for /f "tokens=1* delims=;" %%i in ("%~1") do (
echo %%i
if not "%%j"=="" call :loop "%%j"
)
goto :eof
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
plp626 +15 2008-05-31 01:51
WANKOILZ +2 2008-05-31 11:53
moniuming +8 2008-05-31 14:47
致精致简!
4 发表于 2008-05-31 01:41 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
针对这个样本,我的代码:
str=test string;
str=;%str%
for /f "delims=" %%a in ("%str;="%")do call:arr %%a
pause
:arr
if %~1.==. goto:eof
echo\%1>>tmp.txt
shift
goto:arr

[ Last edited by plp626 on 2008-5-31 at 01:44 AM ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
5 发表于 2008-05-31 01:51 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
re 26933062
兄的代码不错,有些时间不来这里看我写的代码竟然都。。。。不是P了
汗!
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
6 发表于 2008-05-31 01:57 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
再来一个

@echo off
for /f "delims=" %%a in (a.txt) do call :loop "%%a"
pause
:loop
set str=%~1
set str=%str:;=^&echo\%
echo %str%
goto :eof


[ Last edited by 26933062 on 2008-5-31 at 01:58 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
WANKOILZ +2 2008-05-31 11:55
致精致简!
7 发表于 2008-05-31 02:04 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
上面6楼代码思想值得借鉴。。。
仔细看我上面发的代码其实是想这样:
set str=1 86.2;2 90.0;3 87.8;4 83.4;5 88.0;6 84.1;7 83.2;8 80.6;9 74.0;10 73.7;11 71.5;12 72.7;13 70.4;14 75.0;15 72.1;16 80.0;17 75.4;18 83.7;19 87.0;20 88.0;21 85.6;22 81.1;23 90.0;24 88.7;25 89.6;26 86.1;27 75.5;28 81.6;29 80.1;30 88.0;31 72.2;32 77.6;33 80.0;34 72.9;35 72.6;36 70.5;37 78.0;38 69.5;39 72.4;40 72.4;41 74.3;42 74.4;43 80.0;44 88.1;45 88.5;46 90.9;47 94.0;48 89.0;49 94.2;50 97.0;51 90.0;52 95.2;
set str=%str: =+%
set str=%str: =;%
for /f "delims=" %%a in ("%str%")do call:arr %%a
pause
:arr
if %1.==. goto:eof
set s=%1
echo\%s:+= %
shift
goto:arr
有些命令竟然那样用,犯晕了

[ Last edited by plp626 on 2008-5-31 at 02:06 AM ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
8 发表于 2008-05-31 02:06 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
@echo off & Setlocal EnableDelayedExpansion

for /f "delims=" %%a in (cn-dos.txt) do (
set "string=%%a"
for %%b in ("!string:;=" "!") do (echo.%%~b)
)
9 发表于 2008-05-31 02:07 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
没看懂,你这两句不矛盾吗?
set str=%str: =+%
set str=%str: =;%
致精致简!
10 发表于 2008-05-31 02:10 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
8 楼 巧妙啊!
致精致简!
11 发表于 2008-05-31 02:15 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
把空格换成+再把;换成空格
我写反了,真是不可原谅呵
其实还可以删掉那个替换分号的语句
@echo off
set str=1 86.2;2 90.0;3 87.8;4 83.4;5 88.0;6 84.1;7 83.2;8 80.6;9 74.0;10 73.7;11 71.5;12 72.7;13 70.4;14 75.0;15 72.1;16 80.0;17 75.4;18 83.7;19 87.0;20 88.0;21 85.6;22 81.1;23 90.0;24 88.7;25 89.6;26 86.1;27 75.5;28 81.6;29 80.1;30 88.0;31 72.2;32 77.6;33 80.0;34 72.9;35 72.6;36 70.5;37 78.0;38 69.5;39 72.4;40 72.4;41 74.3;42 74.4;43 80.0;44 88.1;45 88.5;46 90.9;47 94.0;48 89.0;49 94.2;50 97.0;51 90.0;52 95.2;
set str=%str: =+%
for /f "delims=" %%a in ("%str%")do call:arr %%a
pause
:arr
if %1.==. goto:eof
set s=%1
echo\%s:+= %
shift
goto:arr
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
12 发表于 2008-05-31 02:34 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
一行分成多行论坛上应该有的吧 可能你没注意
简单!简单!再简单!
13 发表于 2008-05-31 02:42 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
Originally posted by terse at 2008-5-31 02:34 AM:
一行分成多行论坛上应该有的吧 可能你没注意


恩,是我没认真搜索,以后注意。。。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
14 发表于 2008-05-31 11:12 ·  中国 北京 联通
社区乞丐
积分 -61
发帖 37
注册 2008-04-19 17:10
18年会员
UID 116329
性别 男
状态 离线
如果从通用性来说3楼的是最理想的,毕竟SET设置变量是有限制的,如果不计较这个限制可以更加简化

@echo off&setlocal
set/p a=<1.txt
for %%b in ("%a:;=" "%") do echo.%%~b


[ Last edited by FQ on 2008-5-31 at 11:14 AM ]
15 发表于 2008-05-31 12:15 ·  中国 重庆 合川区 电信
初级用户
★★
积分 198
发帖 89
注册 2007-09-06 23:22
18年会员
UID 96746
性别 男
来自 重庆
状态 离线
3,6,8楼的都强,特别是6楼,不知道是怎么想出来的.11楼那个也够简洁.我也发一个,也算是一个方法:
@echo off
for /f "delims=" %%i in (1.txt) do (
set "str=%%i"&call :loop
)
pause

:loop
set tmp=%str:*;=%
if not defined tmp (echo %str:~0,-1%&goto :eof)
call set mystr=%%str:%tmp%=%%
echo %mystr:~0,-1%&set str=%tmp%
if defined str goto loop


[ Last edited by WANKOILZ on 2008-5-31 at 12:17 PM ]
论坛跳转: