Board logo

标题: 【讨论】一行分成多行 [打印本页]

作者: plp626     时间: 2008-5-31 01:24    标题: 【讨论】一行分成多行



  Quote:
论坛里不乏多行拼接成一行的,偶数行奇数行拼接的代码
但一行分成多行的代码我至今没发现,我不是指那个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 ]
作者: plp626     时间: 2008-5-31 01:27
说白了就是告诉cmd将“;”当作换行符号

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

怎么用换行符替换“;”?
作者: 26933062     时间: 2008-5-31 01:31

@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

作者: plp626     时间: 2008-5-31 01:41
针对这个样本,我的代码:
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 ]
作者: plp626     时间: 2008-5-31 01:51
re 26933062
兄的代码不错,有些时间不来这里看我写的代码竟然都。。。。不是P了
汗!
作者: 26933062     时间: 2008-5-31 01:57
再来一个
@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 ]
作者: plp626     时间: 2008-5-31 02:04
上面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 ]
作者: lxmxn     时间: 2008-5-31 02:06

@echo off & Setlocal EnableDelayedExpansion

for /f "delims=" %%a in (cn-dos.txt) do (
        set "string=%%a"
        for %%b in ("!string:;=" "!") do (echo.%%~b)
)

作者: 26933062     时间: 2008-5-31 02:07
没看懂,你这两句不矛盾吗?
set str=%str: =+%
set str=%str: =;%
作者: 26933062     时间: 2008-5-31 02:10
8 楼 巧妙啊!
作者: plp626     时间: 2008-5-31 02:15
把空格换成+再把;换成空格
我写反了,真是不可原谅呵
其实还可以删掉那个替换分号的语句
@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
作者: terse     时间: 2008-5-31 02:34
一行分成多行论坛上应该有的吧  可能你没注意
作者: plp626     时间: 2008-5-31 02:42


  Quote:
Originally posted by terse at 2008-5-31 02:34 AM:
一行分成多行论坛上应该有的吧  可能你没注意

恩,是我没认真搜索,以后注意。。。
作者: FQ     时间: 2008-5-31 11:12
如果从通用性来说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 ]
作者: WANKOILZ     时间: 2008-5-31 12:15
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 ]
作者: plp626     时间: 2008-5-31 17:19
不识货!