标题: 将文档内容,横列变为纵列
[打印本页]
作者: 26933062
时间: 2007-8-20 04:04
标题: 将文档内容,横列变为纵列
将文本纵向显示.
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
作者: slore
时间: 2007-8-20 08:17
BAT我觉得不能实现,或者说很难实现。
脚本的话,定义个2维数组,然后转置输出即可。
作者: youxi01
时间: 2007-8-20 11:39
效率是比较低的了:
@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%
作者: slore
时间: 2007-8-20 12:24
没想到P的代码也不是很复杂……我把VBS的也贴上吧
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
= Nothinga 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
作者: namejm
时间: 2007-8-20 12:56
来段效率高点的代码,通过构造数组来实现,没有考虑特殊情况:
@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
[
Last edited by namejm on 2007-8-20 at 06:06 PM ]
作者: HAT
时间: 2007-8-20 13:47
数组用的妙
学习
作者: youxi01
时间: 2007-8-20 13:48
楼上的不错,不过还有点点问题,我乱想的,提出来而已,错了别见怪啊
如果行数超过了10行的时候,怎么办?
根据你的思路:str111它要如何去识别?
当%%i取1 %%j取11的时候可以为str111
当%%i取11 %%j取1的时候,还是str111,这样是不是有点矛盾拉?
将str111这样的表达形式改为str1101的形式可以好点吧?!
作者: namejm
时间: 2007-8-20 13:57
本来行和列之间是有下划线连接的,发出来的时候,嫌_!_num!的格式不好看,没考虑太多,就临时去掉了,还是补回去吧。
作者: slore
时间: 2007-8-20 14:10
还是脚本里数组好用嗬
作者: 26933062
时间: 2007-8-20 14:43
namejm 版主
你的下划线还是没显示出来啊
输出格式还是很不整齐,这也正是我昨晚卡壳的地方.
我的思路是,在设变量前,先判断该变量有几个字符,来决定该在前面加几个空格.
其实应该不难,但怎么就是搞不对.
作者: HAT
时间: 2007-8-20 14:56
//我的思路是,在设变量前,先判断该变量有几个字符,来决定该在前面加几个空格.
那岂不是要再加for循环
时间复杂度要变成O(n的3次方)啦
作者: youxi01
时间: 2007-8-20 15:35
对齐不是难点,用空格补齐就行了
作者: 26933062
时间: 2007-8-20 15:54
问题是如何加?
我想了很久都没加上去
作者: slore
时间: 2007-8-20 15:56
你每个 单位字的长度没有什么限制……
如果:
1 128312718478 2 sd gadf
adfdfsf 23 dfsdfsdfsd 0 12 12 44 5 2 35
12312 1 2423 45345 32323
1 2 3 4 5 6 7 8 9 10
长的和短的差很多,还是不好排版的(即便用TAB字符也一样不好对齐)。
作者: 26933062
时间: 2007-8-20 16:07
Quote: |
Originally posted by slore at 2007-8-20 15:56:
你每个 单位字的长度没有什么限制…… |
|
我现在的a.txt内容全是单个字符,且全用空格分开的.
作者: slore
时间: 2007-8-20 16:18
那样的话,我的脚本输出的效果是很整齐的……
作者: namejm
时间: 2007-8-20 18:05
Quote: |
Originally posted by 26933062 at 2007-8-20 14:43:
namejm 版主
你的下划线还是没显示出来啊
输出格式还是很不整齐,这也正是我昨晚卡壳的地方.
我的思路是,在设变量前,先判断该变量有几个字符,来决定该在前面加几个空格.
其实应该不难,但怎么就是搞不对. |
|
下划线无须在结果中显示出来。
我那个 set /p 语句 <nul 前是跳格键,在论坛里会被转换为空格,复制下来之后,请重新手工设置为跳格键,否则,将起不到对齐的效果。不过,跳格键默认占用8字节,所以,如果每个元素的字节小于8个,无须判断字符数的多少就可以对齐显示,如果大于等于8个就很难看了。
作者: youxi01
时间: 2007-8-20 18:12
对齐的问题:
借用namejm的代码:
@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
作者: vkill
时间: 2007-8-20 20:12
记得在chinaunix上有个用gawk写的,那个效率应该快多了
作者: 26933062
时间: 2007-8-20 20:42
Quote: |
Originally posted by youxi01 at 2007-8-20 18:12:
对齐的问题:
借用namejm的代码:
[code]
|
|
你们太强了,这样的代码我是怎么也想不出来的了.
绕了一大堆弯,效率低不说,还不能解决问题....唉!