批处理之家's Archiver

Batcher 发表于 2009-6-14 13:47

文本文件行列互置的批处理

【问题】将文档内容横列变为纵列

a.txt内容如下:
a b c d e f
h i j k l m n
1 2 3 4 5
6 7 8 9 10 11 12 13 14 15
a s d
11 12 13 14 15

要求输出结果如下:
a h 1 6 a 11
b i 2 7 s 12
c j 3 8 d 13
d k 4 9   14
e l 5 10  15
f m   11
  n   12
      13
      14
      15


【方法1】效率是比较低的了[code]@echo off
for /f "delims=" %%i in (test.txt) do (
   set /a n+=1
   call set "str%%n%%=%%i "
)

for /l %%i in (1 1 10) do call :join
pause>nul

:split obj
call set "var=%%%1%%"
if "%var%"=="" set "str=" &goto :eof
for %%i in (%var%) do (
  set "str=%%i"
  call set "%1=%%var:* =%%"
  goto :eof
)

:join
set "tmp="
for /l %%i in (1 1 %n%) do (
  call :split str%%i
  call set tmp=%%tmp%% %%str%%
)
echo.%tmp%[/code]【方法2】来段效率高点的代码,通过构造数组来实现,没有考虑特殊情况:[code]@echo off
:: 注意: set /p= 语句<nul前的空格是跳格键,在论坛中会被转换为空格
:: 复制下来之后,请重新手工设置跳格,否则,将不能起到对齐的效果。
set /a num=0,_num=0,max=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
    set /a num+=1,_num=0
    for %%j in (%%i) do (
        set /a _num+=1
        set str!num!_!_num!=%%j
        if !_num! geq !max! set max=!_num!
    )
)
for /l %%i in (1,1,%max%) do (
    for /l %%j in (1,1,%num%) do (
       set /p=!str%%j_%%i!        <nul
    )
    echo.
)
pause[/code]【方法3】借用namejm的代码解决对齐的问题:[code]@echo off
set /a num=0,_num=0,max=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
    set /a num+=1,_num=0
    for %%j in (%%i) do (
        set /a _num+=1
        set str!num!_!_num!=%%j
        if !_num! geq !max! set max=!_num!
    )
)
for /l %%i in (1,1,%max%) do (
    set "res="
    for /l %%j in (1,1,%num%) do (
       set "var=!str%%j_%%i!     "
       set "res=!res!!var:~0,5!"
    )
    echo !res!
)
pause[/code]【方法4】没想到批处理代码也不是很复杂,我把VBS的也贴上吧:[code]Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("In.txt",ForReading)

Dim InputStr,lineIndex,TempArr,OutArr(100,100)

Do Until objFile.AtEndOfStream
    InputStr = objFile.ReadLine
    TempArr = Split(InputStr," ")
    If UBound(TempArr) > MaxY Then MaxY = UBound(TempArr)
    For i = 0 To UBound(TempArr)
        OutArr(lineIndex,i) = TempArr(i)
    Next
    lineIndex = lineIndex + 1
Loop

objFile.Close
Set objFile = objFSO.OpenTextFile("Out.txt",ForWriting,True)
For i = 0 To MaxY
    For j = 0 To lineIndex - 1
        If OutArr(j,i) = "" Then OutArr(j,i) = " "
        OutStr = OutStr & OutArr(j,i) & " "
    Next
    objFile.WriteLine OutStr
    OutStr = ""
Next
objFile.Close

Set objFile = Nothing
Set objFSO = Nothing[/code]原文地址:[url]http://www.cn-dos.net/forum/viewthread.php?tid=32931[/url]

keen 发表于 2009-6-14 14:52

感谢batcher,总能给我们带回经典的批处理。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.