中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-12 05:26
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [出题][限新手]将连续空格替换为一个<tab>键 查看 924 回复 6
楼 主 [出题][限新手]将连续空格替换为一个<tab>键 发表于 2009-03-13 09:25 ·  中国 天津 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
只限新手
现在有一个文本"1.txt",文本中有多行多列,列数不同,各列中是以空格为分隔符的,空格的数目不相同.
要求:把1.txt中各列间的所有空格用一个<tab>键代替,并写入2.txt中.
效果如下:
1.txt
1 2 3 4 5 6
1 2 3 4 5 6 7 8
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7
2.txt
1 2 3 4 5 6
1 2 3 4 5 6 7 8
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7

1.txt可用下面的代码来生成:
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1 1 10) do (set "kong=!kong! ")
for /l %%a in (1 1 5) do (
set /a num=!random!%%5+5
set "str="
for /l %%a in (1 1 !num!) do (
set /a var=!random!%%5+5
call set "str=!str!%%a%%kong:~0,!var!%%"
)
echo.!str!
)>>1.txt
2 发表于 2009-03-13 11:02 ·  中国 江苏 苏州 电信
初级用户
积分 20
发帖 13
注册 2009-01-05 14:58
17年会员
UID 135829
性别 男
状态 离线

@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (1.txt) do (
call :kp "%%i"
>>2.txt echo !all!
set all=
)
pause
:kp
set x=%~1
:lp
set a=%x:~,1%
set "x=%x:~1%
if not "%a%"==" " set "all=!all!%a% "
if defined x (goto lp) else (goto :eof)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +7 2009-03-13 11:26
3 发表于 2009-03-13 11:08 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
@echo off
(for /f "tokens=*" %%a in (1.txt) do call :sub %%a)>2.txt
pause
goto :eof

:sub
if "%2"=="" echo.%1&goto :eof
set /p =%1<nul
shift
goto :sub


[ Last edited by netbenton on 2009-3-13 at 18:50 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +15 2009-03-13 11:26
精简
=> 个人网志
4 发表于 2009-03-13 12:31 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%a in (1.txt) do (
set str=
for %%i in (%%a) do set str=!str!%%i
echo !str:*=!
))>2.txt


[ Last edited by tireless on 2009-3-13 at 12:32 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +13 2009-03-16 00:03
5 发表于 2009-03-14 05:35 ·  中国 江苏 苏州 电信
初级用户
积分 20
发帖 13
注册 2009-01-05 14:58
17年会员
UID 135829
性别 男
状态 离线

set fso=createobject("scripting.filesystemobject")
set fc=fso.createtextfile("2.txt")
set f=fso.opentextfile("1.txt")
while f.atendofstream <> true
stro=f.readline
for i=0 to len(stro)
if mid(stro,i+1,1)<>" " then s=s&mid(stro,i+1,1)&" "
next
fc.writeline s
s=""
wend
6 发表于 2009-03-16 00:02 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
点评一下:
2楼的通用性不高.
3楼shift的用法很好,能加的分都加了.
4楼是最普遍的方法了.
5楼的不敢评价...
感慨一下:看来论坛里的是牛人居多啊,竟然没什么新手来试试,唉...
帖一个另类的代码吧,效率不高:
@echo off
setlocal enabledelayedexpansion
for %%a in (1 2) do (
type nul>%%a.txt
)
for /l %%a in (1 1 10) do (set "kong=!kong! ")
(
for /l %%a in (1 1 5) do (
set /a num=!random!%%5+5
set "str="
for /l %%a in (1 1 !num!) do (
set /a var=!random!%%5+5
call set "str=!str!%%a%%kong:~0,!var!%%"
)
echo.!str!
)
)>1.txt
(
for /f "delims=" %%a in (1.txt) do (
set "str="
call :lp "%%a"
echo.!str!
)
)>2.txt
for %%a in (1 2) do (
echo.%%a.txt
type %%a.txt
)
pause&goto :eof
:lp
for /f "tokens=1,*" %%a in (%1) do (
if not "%%b"=="" (
set "str=!str!%%a "
call :lp "%%b"
) else (
set "str=!str!%%a"
)
)
7 发表于 2009-08-16 07:10 ·  中国 广西 南宁 西乡塘区 电信
初级用户
★★
积分 99
发帖 53
注册 2006-08-18 18:44
19年会员
UID 60809
状态 离线
方法和tireless一样;)


@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "TOKENS=*" %%I IN (1.TXT) DO (
SET "FOO=%%I"
FOR %%A IN (%%I) DO (
SET FOO=!FOO:%%A=%%A#!
SET FOO=!FOO: =!
SET FOO=!FOO:#=!
)
ECHO.!FOO!
)
PAUSE>NUL
论坛跳转: