Board logo

标题: [出题][限新手]将连续空格替换为一个<tab>键 [打印本页]

作者: moniuming     时间: 2009-3-13 09:25    标题: [出题][限新手]将连续空格替换为一个<tab>键

只限新手
    现在有一个文本"1.txt",文本中有多行多列,列数不同,各列中是以空格为分隔符的,空格的数目不相同.
    要求:把1.txt中各列间的所有空格用一个<tab>键代替,并写入2.txt中.
    效果如下:
CODE:  [Copy to clipboard]
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可用下面的代码来生成:
CODE:  [Copy to clipboard]
@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

作者: BaseCoder     时间: 2009-3-13 11:02
CODE:  [Copy to clipboard]
@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)

作者: netbenton     时间: 2009-3-13 11:08
CODE:  [Copy to clipboard]
@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[tab]<nul
shift
goto :sub
[ Last edited by netbenton on 2009-3-13 at 18:50 ]
作者: tireless     时间: 2009-3-13 12:31
CODE:  [Copy to clipboard]
@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%a in (1.txt) do (
  set str=
  for %%i in (%%a) do set str=!str![tab]%%i
  echo !str:*[tab]=!
))>2.txt
[ Last edited by tireless on 2009-3-13 at 12:32 ]
作者: BaseCoder     时间: 2009-3-14 05:35
CODE:  [Copy to clipboard]
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

作者: moniuming     时间: 2009-3-16 00:02
点评一下:
2楼的通用性不高.
3楼shift的用法很好,能加的分都加了.
4楼是最普遍的方法了.
5楼的不敢评价...
感慨一下:看来论坛里的是牛人居多啊,竟然没什么新手来试试,唉...
帖一个另类的代码吧,效率不高:
CODE:  [Copy to clipboard]
@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"
  )
)

作者: asnahu     时间: 2009-8-16 07:10
方法和tireless一样;)
CODE:  [Copy to clipboard]
@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:#=[TAB]!
     )
     ECHO.!FOO!
)
PAUSE>NUL