中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [已结]bat能够处理换行符吗 上一主题 | 下一主题
0401
中级用户

带走



积分 435
发帖 88
注册 2005-9-24
状态 离线
『楼 主』:  [已结]bat能够处理换行符吗

当我处理一个文件时,我想把多行合并为一行。

#type 1.txt
1
2
3

我希望在处理完文件1.txt后变成如下:

#type 2.txt
123

这个文件中只有字母及数字,没其他特殊字符。
请大家给我提供个思路,谢谢。

[ Last edited by 0401 on 2006-2-26 at 11:15 ]

2006-2-25 15:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





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

@echo off
if exist 123.txt echo y | del 123.txt
set /a num = 1
:newfile
echo %num% >>123.txt
set /a num = %num% + 1
if %num% == 4 goto next
goto newfile

:next
setlocal enabledelayedexpansion
for /f %%i in (123.txt) do set str=!str!%%i
echo %str% > 2.txt
endlocal
type 2.txt
pause>nul

试试吧,在XP专业版下测试通过。。

2006-2-25 18:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 3 楼』:  

我也来一个,此命令可删除所有换行符,要求CMD下。
for /f "delims=" %i in (1.txt) do @(set /p=%i<nul)
[ Last edited by 无奈何 on 2006-2-25 at 20:41 ]



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-2-25 20:38
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『第 4 楼』:  

2楼老兄:
你的答案好象有些偏提.(只是做了个空架子,并没有把多行合并为一行。)
=======1.txt 内容=========
1, A1
2, B2
3, C3

=======2.txt 内容应该是这样的=========
1, A1B2C3

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





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



  Quote:
Originally posted by dosz at 2006-2-25 23:59:
2楼老兄:
你的答案好象有些偏提.(只是做了个空架子,并没有把多行合并为一行。)
=======1.txt 内容=========
1, A1
2, B2
3, C3

=======2.txt 内容应该是这样砮..

呵呵,牛角尖。。。
别人说了是给个思路,至于自己用可以for /?去修改。

2006-2-26 01:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
0401
中级用户

带走



积分 435
发帖 88
注册 2005-9-24
状态 离线
『第 6 楼』:  

to 3742668:
原来set还有这么个用法啊,以前因为理解不来就给跳过了,还有延迟环境变量扩充的问题。
setlocal enabledelayedexpansion
for /f %%i in (123.txt) do set str=!str!%%i
echo %str% > 2.txt
endlocal
这段我给记下了,回去好好研究。thx

to 无奈何:
呵呵,简洁有力。以前我就有研究过你的签名了。thx

谢谢大家。

2006-2-26 11:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『第 7 楼』:  

to 3742668:
我5楼说的欠妥的地方请兄长多包含。
烦劳你能否编释一个同时用于多个文件的批处理。
比如说:
==1a.txt 内容===   执行后为   ===1b.txt 内容===
1                                          123
2
3

==2a.txt 内容===   执行后为   ===2b.txt 内容===
A                                          ABC
B
C

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





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

to 楼上
只要把里面具体的文件名改成%1就可以了,还是给个片段给你:
@echo off
if not exist "%1" echo 请检查参数是否正确 && goto :eof
setlocal enabledelayedexpansion

:read
for /f %%i in (%1) do set str=!str!%%i
echo %str%
set str=
if exist "%2" shift && goto read
  
endlocal
支持多个参数。

2006-2-27 09:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  

Re 3742668:

      使用环境变量合并文本行存在一个隐忧,即当文本内容大于系统的环境空间时,将出现文本溢出。在我的测试中([1]CMD·WinXP),单个变量长度达到8189时溢出,而生成的 _varlen.txt 大小为 16382,由此猜测当前延迟变量替换的环境空间上限可能是16K(16384),剩余的字节可能是变量名、等于号、变量结束标记等。而且上面代码中的 for /f 没有使用 "delims=" 也会因此忽略空格后的文本。

      所以目前来看,还是 无奈何 兄的命令行更为有效些。
:: Test of environment variable length
@echo off & setlocal EnableDelayedExpansion
set 1=

for /l %%i in (0,1,1000000) do (
    set 2=!1!1
    if not "!2!"=="!1!1" (
        echo !1! > _varlen.txt
        copy _varlen.txt _vl1.txt > nul
        echo !2! >> _varlen.txt
        echo Length: %%i
        goto :eof
    )
    set 1=!2!
)

:eof
[ Last edited by willsort on 2006-3-2 at 16:11 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-3-2 15:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: