中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 16:56
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决一半]数据换列? 查看 937 回复 12
楼 主 [已解决一半]数据换列? 发表于 2008-09-02 16:36 ·  中国 山西 朔州 联通
初级用户
积分 54
发帖 20
注册 2006-12-13 23:52
19年会员
UID 73432
性别 男
状态 离线
1|aaaa|bbbb|cccc|sddsd|
2|aaa|cccccccc|ddddd|3dfdsf|fdsfsdfsd|
.....

每行的列数不固定,现想把后两列调换位置,即

1|aaaa|bbbb|sddsd|cccc|
2|aaa|cccccccc|ddddd|fdsfsdfsd|3dfdsf|

[ Last edited by oicq63236 on 2008-9-9 at 10:38 PM ]
2 发表于 2008-09-02 20:34 ·  中国 江苏 苏州 中移铁通
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (e.txt) do (
set a=%%i
set a=!a:^|=.!
for /f %%a in ("!a!") do (
set Before=%%~na
set LastOne=%%~xa
for /f %%x in ("!Before!") do (
set BBefore=%%~nx
set LLastOne=%%~xx
)
)
for /f %%m in ("!BBefore!!LastOne!!LLastone!.") do (
set ChangeB=%%m
set ChangeB=!ChangeB:.=^|!
echo !ChangeB!
)
)
pause
3 Re 2楼 发表于 2008-09-02 21:53 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
如果两个|之间的字符存在.,会出问题吧。
4 发表于 2008-09-02 22:27 ·  中国 山西 朔州 联通
初级用户
积分 54
发帖 20
注册 2006-12-13 23:52
19年会员
UID 73432
性别 男
状态 离线
实际情况是,那些字符串中会有金额出现,例如3000.53,再怎么修改一下呢?
5 发表于 2008-09-02 23:05 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
如果按照2楼的思路,可以把|替换成一个你的文件中不会出现的字符。
但我觉得这样做始终存在风险。
6 发表于 2008-09-02 23:31 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
这样的问题还是用 awk 比较好点
gawk "BEGIN{OFS=FS=\"^|\"} {t=$(NF-2);$(NF-2)=$(NF-1);$(NF-1)=t;print}" your_file
7 发表于 2008-09-02 23:41 ·  中国 江苏 苏州 中移铁通
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
斑竹的第三方工具用的熟练.重新写了个,基本能实现上面的要求

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (e.txt) do (
set m=
set n=
set l=
set a=%%i
set a=!a:^|= !

for %%a in (!a!) do (
set /a n+=1
set _!n!=%%a
)

set /a m=n-1
set /a l=m-1

for /l %%t in (1 1 !l!) do (set /p=!_%%t!^|<nul)
call set dim=%%_!n!%% %%_!m!%%
set dim=!dim: =^|!
echo !dim!^|

)

pause
8 发表于 2008-09-03 00:15 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
学习斑竹的思路
9 发表于 2008-09-04 09:27 ·  中国 山西 朔州 联通
初级用户
积分 54
发帖 20
注册 2006-12-13 23:52
19年会员
UID 73432
性别 男
状态 离线
谢谢大家了!
10 发表于 2008-09-09 22:05 ·  中国 山西 朔州 联通
初级用户
积分 54
发帖 20
注册 2006-12-13 23:52
19年会员
UID 73432
性别 男
状态 离线
huahua0919
兄,你的代码不错,可惜有些地方领会不了,还请赐教!


@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (e.txt) do ( <--将E.TXT中的一行字串赋于%%i
set m=
set n=
set l=
set a=%%i
set a=!a:^|= ! <-将%%i中的|线替换为空格

for %%a in (!a!) do ( <-将%%i分解为各个字串
set /a n+=1 <-记录每个字串的位置
set _!n!=%%a ??????(_!n!是什么意思)
)

set /a m=n-1 <-定义倒数第二个字串位置
set /a l=m-1 <-定义不需转换的最后一个字串位置

for /l %%t in (1 1 !l!) do (set /p=!_%%t!^|<nul) ??????
call set dim=%%_!n!%% %%_!m!%% <-交换最后两例位置,为什么必须得call呢,直接set却不行?
set dim=!dim: =^|! <-将空格换回|线
echo !dim!^| 这里不是只输出!dim!吗?
难道是接着上边set /p=..这儿继续输 出?

)
本人愚钝,请赐教,谢谢!(以上有注释的地方正确吗)
pause

[ Last edited by oicq63236 on 2008-9-9 at 10:37 PM ]
11 发表于 2008-09-09 22:30 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
代码保存为test.bat
双击运行看看结果
setlocal enabledelayedexpansion
for /f "delims=" %%i in (e.txt) do (
set m=
set n=
set l=
set a=%%i
set a=!a:^|= !

for %%a in (!a!) do (
set /a n+=1
set _!n!=%%a
)

set /a m=n-1
set /a l=m-1

for /l %%t in (1 1 !l!) do (set /p=!_%%t!^|<nul)
call set dim=%%_!n!%% %%_!m!%%
set dim=!dim: =^|!
echo !dim!^|

)

pause
12 发表于 2008-09-09 22:38 ·  中国 山西 朔州 联通
初级用户
积分 54
发帖 20
注册 2006-12-13 23:52
19年会员
UID 73432
性别 男
状态 离线
代码已运行过了,很好使,只是不懂意思,想弄明白!
13 发表于 2008-09-09 22:42 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
这样会不会清楚些?
setlocal enabledelayedexpansion
for /f "delims=" %%i in (e.txt) do (
set m=
set n=
set l=
set a=%%i
set a=!a:^|= !

for %%a in (!a!) do (
set /a n+=1
set _!n!=%%a
echo _!n!
pause
)

set /a m=n-1
set /a l=m-1

for /l %%t in (1 1 !l!) do (set /p=!_%%t!^|<nul)
call set dim=%%_!n!%% %%_!m!%%
set dim=!dim: =^|!
echo !dim!^|

)

pause
论坛跳转: