中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [已解决一半]数据换列? 上一主题 | 下一主题
oicq63236
初级用户





积分 54
发帖 20
注册 2006-12-13
状态 离线
『楼 主』:  [已解决一半]数据换列?

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 ]

2008-9-2 16:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 2 楼』:  


@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


2008-9-2 20:34
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  Re 2楼

如果两个|之间的字符存在.,会出问题吧。



2008-9-2 21:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
oicq63236
初级用户





积分 54
发帖 20
注册 2006-12-13
状态 离线
『第 4 楼』:  

实际情况是,那些字符串中会有金额出现,例如3000.53,再怎么修改一下呢?

2008-9-2 22:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

如果按照2楼的思路,可以把|替换成一个你的文件中不会出现的字符。
但我觉得这样做始终存在风险。



2008-9-2 23:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

这样的问题还是用 awk 比较好点
gawk "BEGIN{OFS=FS=\"^|\"} {t=$(NF-2);$(NF-2)=$(NF-1);$(NF-1)=t;print}" your_file


2008-9-2 23:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 7 楼』:  

斑竹的第三方工具用的熟练.重新写了个,基本能实现上面的要求
@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


2008-9-2 23:41
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  

学习斑竹的思路



2008-9-3 00:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
oicq63236
初级用户





积分 54
发帖 20
注册 2006-12-13
状态 离线
『第 9 楼』:  

谢谢大家了!

2008-9-4 09:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
oicq63236
初级用户





积分 54
发帖 20
注册 2006-12-13
状态 离线
『第 10 楼』:  

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 ]

2008-9-9 22:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  

代码保存为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




2008-9-9 22:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
oicq63236
初级用户





积分 54
发帖 20
注册 2006-12-13
状态 离线
『第 12 楼』:  

代码已运行过了,很好使,只是不懂意思,想弄明白!

2008-9-9 22:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 13 楼』:  

这样会不会清楚些?
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




2008-9-9 22:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: