Board logo

标题: [英雄求助帖已结]数据格式转换输出问题求教! [打印本页]

作者: hbby     时间: 2007-10-20 18:11    标题: [英雄求助帖已结]数据格式转换输出问题求教!

我有data.txt文本,内容如下:

1  135817  C178189  16  ¥32  3  *  3  *  0  31  10  31  3  *  *  0  *  10  1  出票  撤销  过期  下载  
2  135935  C177784  48  ¥96  3  *  *  31  *  310  *  3  31  30  31  *  10  0  1  出票  撤销  过期  下载  
3  135943  C178126  16  ¥32  31  30  *  31  0  *  0  3  3  *  *  0  *  10  1  出票  撤销  过期  下载  
4  135989  C178199  1  ¥2  3  *  3  *  *  3  0  3  3  *  *  0  0  0  1  出票  撤销  过期  下载  
5  135990  C178199  1  ¥2  3  *  3  *  0  3  *  3  3  *  *  0  0  0  1  出票  撤销  过期  下载  
6  135991  C178199  1  ¥2  3  *  3  *  0  3  0  3  3  *  *  0  0  *  1  出票  撤销  过期  下载  
7  135992  C178199  1  ¥2  3  *  3  3  *  3  *  3  3  *  *  0  0  0  1  出票  撤销  过期  下载  
8  135993  C178199  1  ¥2  3  *  3  3  *  3  0  3  3  *  *  0  0  *  1  出票  撤销  过期  下载  
9  135994  C178199  1  ¥2  3  *  3  3  0  3  *  3  3  *  *  0  0  *  1  出票  撤销  过期  下载  
10  135995  C178199  1  ¥2  3  0  3  *  *  3  *  3  3  *  *  0  0  0  1  出票  撤销  过期  下载  

我想通过批处理把以上内容转换成以下格式,要求是:
1、删除前5列数据
2、从第6列的数据开始到19列的数据逢两位数和三位数就加括号,如30变成(30)
3、删除后20--24列数据
4、然后输出两个文件分别为1.TXT 2.TXT,1.TXT中包含所有带括号的数据,2.TXT中包含所有不带括号的数据

转换后格式如下

1.TXT
3*3*0(31)(10)(31)3**0*(10)
3**(31)*(310)*3(31)(30)(31)*(10)0
(31)(30)*(31)0*033**0*(10)

2.TXT
3*3**3033**000
3*3*03*33**000
3*3*03033**00*
3*33*3*33**000
3*33*3033**00*
3*3303*33**00*
303**3*33**000

请高手指点,谢谢!

[ Last edited by hbby on 2007-10-20 at 11:13 PM ]
作者: slore     时间: 2007-10-20 18:14
10为什么不加?
作者: hbby     时间: 2007-10-20 18:20
10也加
作者: junchen2     时间: 2007-10-20 20:08
echo off
@for /f "tokens=6-19" %%a in (a.txt) do (
echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n|sed "s/[0-9][0-9]/\(&\)/g"|sed "s/ *//g"|more>>hbby_DATE.txt
)
sed "/^$/d" hbby_DATE.txt|sed -e "1,3w 1.txt" -e "4,$w 2.txt"
del hbby_DATE.txt
pause

[ Last edited by junchen2 on 2007-10-20 at 08:49 PM ]
作者: 26933062     时间: 2007-10-20 20:32

@echo off&set ji=2
setlocal EnableDelayedExpansion
for /f "tokens=5* delims= " %%a in (a.txt) do (
set var= %%b
set var=!var: *= #!
set var=!var:  出票=$!
set lis=!var:*$=!
call set lis=%%var:!lis!=%%
for %%i in (!lis!) do set ti=%%i
call set var=%%lis:!ti!=%%
for %%i in (!var!) do (
set num=%%i
if not "!num:~1,1!"=="" (set str=!str!^(%%i^)&set ji=1) else set str=!str!%%i
)
set str=!str:#= *!
set str=!str: =!
echo !str!>>!ji!.txt
set str=
set ji=2
)
pause
[ Last edited by 26933062 on 2007-10-20 at 10:55 PM ]
作者: hbby     时间: 2007-10-20 20:51
感谢4、5楼的老哥,四楼大哥输出有问题,还不是很完善
5楼的大哥结果有误,请你们在帮我想想,谢谢
作者: vkill     时间: 2007-10-20 20:57
看错题目要求.....哎

[ Last edited by vkill on 2007-10-20 at 09:44 PM ]
作者: junchen2     时间: 2007-10-20 20:57
我测试没有问题。
作者: slore     时间: 2007-10-20 20:58
@echo off&setlocal EnableDelayedExpansion
for /f "tokens=6,7,8,9,10,11,12,13,14,15,16,17,18,19" %%a in (list.txt) do @Call :MySub %%a %%b %%c %%d %%e

%%f %%g %%h %%i %%j %%k %%l %%m %%n

pause>nul
GOTO :EOF

:MySub
Set StrAll=
:loop
Set Temp=%1
if %Temp:~0,1%==%1 Set StrAll=%StrAll%%1
if not %Temp:~0,1%==%1 Set StrAll=%StrAll%(%1)

shift
if "%1" == "" goto :Break
goto loop

:Break
echo %StrAll%

自己最后findstr下括号就可以分开了。
作者: hbby     时间: 2007-10-20 21:12
各位老大思路都很好,就是希望各位大哥帮我测试下结果,我测试总是不行,谢谢大家
作者: vkill     时间: 2007-10-20 21:23


  Quote:
Originally posted by hbby at 2007-10-20 21:12:
各位老大思路都很好,就是希望各位大哥帮我测试下结果,我测试总是不行,谢谢大家

如果不行就是你的表述错误,你自己看着改改 了
作者: slore     时间: 2007-10-20 21:23
测试过的……

截图现在传不了……
作者: lxmxn     时间: 2007-10-20 21:25
data.awk:
{
        flag=0;
        for(i=1;i<=NF;i++){
                if(i<6||i>19){
                        $i="";
                }else{
                        if(length($i)>1){
                                flag+=1;
                                $i="("$i")";
                        }
                }
        }
        gsub(/[ \t]/,"");
        if(flag>0){print $0>"1.txt"}else{print $0>"2.txt"}
}
命令行执行:
gawk -f data.awk data.txt
gawk 为外部工具,自己上网找找。
作者: hbby     时间: 2007-10-20 21:26
junchen2大哥,我导这个数据就出错了
1  137076  C178356  64  ¥128  30  *  3  31  *  31  *  30  3  31  *  0  *  10  1  出票  撤销  过期  下载  
2  137077  C178357  16  ¥32  3  *  *  31  0  *  0  31  31  *  *  0  30  0  1  出票  撤销  过期  下载  
3  137104  C178361  16  ¥32  30  *  3  *  10  31  *  3  3  *  31  0  *  0  1  出票  撤销  过期  下载  
4  137105  C178362  1  ¥2  1  *  3  1  0  *  *  3  *  1  1  *  3  0  1  出票  撤销  过期  下载  
5  137147  C178233  64  ¥128  31  30  3  3  *  31  10  30  *  *  *  0  *  10  1  出票  撤销  过期  下载  
6  137196  C178373  32  ¥64  3  10  3  30  *  *  *  3  *  31  31  30  0  *  1  出票  撤销  过期  下载  
7  137197  C178341  8  ¥16  3  31  3  31  0  *  10  *  3  *  *  0  *  0  1  出票  撤销  过期  下载  
8  137198  C178264  32  ¥64  3  *  3  31  *  3  10  30  3  30  31  *  *  *  1  出票  撤销  过期  下载  
9  137204  C178374  4  ¥8  *  0  3  3  10  3  0  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
10  137205  C178374  4  ¥8  3  *  3  3  10  3  0  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
11  137206  C178374  4  ¥8  3  0  *  3  10  3  0  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
12  137207  C178374  4  ¥8  3  0  3  *  10  3  0  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
13  137208  C178374  4  ¥8  3  0  3  3  10  *  0  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
14  137209  C178374  4  ¥8  3  0  3  3  10  3  *  3  *  *  *  0  *  10  1  出票  撤销  过期  下载  
15  137210  C178374  4  ¥8  3  0  3  3  10  3  0  *  *  *  *  0  *  10  1  出票  撤销  过期  下载  
16  137211  C178374  4  ¥8  3  0  3  3  10  3  0  3  *  *  *  *  *  10  1  出票  撤销  过期  下载  
17  137227  C178369  32  ¥64  *  0  31  *  *  31  10  3  *  *  1  0  10  10  1  出票  撤销  过期  下载  
18  137231  C178376  1  ¥2  *  0  3  1  *  *  1  1  *  1  3  *  0  1  1  出票  撤销  过期  下载  
19  137234  C178378  1  ¥2  *  0  3  1  1  3  *  3  1  *  *  0  *  0  1  出票  撤销  过期  下载  
20  137246  C178310  384  ¥768  31  *  3  31  *  31  10  31  *  *  *  10  310  10  1  出票  撤销  过期  下载
作者: junchen2     时间: 2007-10-20 21:33
我刚才未考虑3位数,等我在改一下

[ Last edited by junchen2 on 2007-10-20 at 09:55 PM ]
作者: slore     时间: 2007-10-20 21:38
(30)*3(31)*(31)*(30)3(31)*0*(10)
3**(31)0*0(31)(31)**0(30)0
(30)*3*(10)(31)*33*(31)0*0
1*310**3*11*30
(31)(30)33*(31)(10)(30)***0*(10)
3(10)3(30)***3*(31)(31)(30)0*
3(31)3(31)0*(10)*3**0*0
3*3(31)*3(10)(30)3(30)(31)***
*033(10)303***0*(10)
3*33(10)303***0*(10)
30*3(10)303***0*(10)
303*(10)303***0*(10)
3033(10)*03***0*(10)
3033(10)3*3***0*(10)
3033(10)30****0*(10)
3033(10)303*****(10)
*0(31)**(31)(10)3**10(10)(10)
*031**11*13*01
*03113*31**0*0
(31)*3(31)*(31)(10)(31)***(10)(310)(10)

这个是我的结果……

从最后一个310就知道你的结果有问题
作者: hbby     时间: 2007-10-20 21:41
lxmxn版主出手,就知有没有!非常感谢,成功解决,但是有没有不用外部命令的方法呢?全部用系统自带的命令,希望各位技术精英出出招!谢谢了!
作者: hbby     时间: 2007-10-20 21:50


  Quote:
Originally posted by junchen2 at 2007-10-20 21:33:
小弟我很菜

[ Last edited by junchen2 on 2007-10-20 at 09:43 PM ]

非常感谢大哥帮我献计献策!我再看看其他朋友的代码。
作者: hbby     时间: 2007-10-20 21:56


  Quote:
Originally posted by junchen2 at 2007-10-20 21:33:
我刚才未考虑3位数,等我在改一下

[ Last edited by junchen2 on 2007-10-20 at 09:55 PM ]

老兄,还是没有通过!您能帮我做下测试吗?谢谢!
作者: junchen2     时间: 2007-10-20 22:03
呵呵,我今天刚看了一些SED的用法,完全是现学现买,sed技术还没能好好掌握。还要闭门在修炼,呵呵!
作者: hbby     时间: 2007-10-20 22:06


  Quote:
Originally posted by junchen2 at 2007-10-20 22:03:
呵呵,我今天刚看了一些SED的用法,完全是现学现买,sed技术还没能好好掌握。还要闭门在修炼,呵呵!

老哥,你就这样收工休息呀?呵呵,不过还是非常感谢你
作者: slore     时间: 2007-10-20 22:08


  Quote:
Originally posted by hbby at 2007-10-20 21:41:
lxmxn版主出手,就知有没有!非常感谢,成功解决,但是有没有不用外部命令的方法呢?全部用系统自带的命令,希望各位技术精英出出招!谢谢了!

如果自己发起问题,就认真阅读别人给你的回帖……
作者: hbby     时间: 2007-10-20 22:27


  Quote:
Originally posted by slore at 2007-10-20 22:08:


如果自己发起问题,就认真阅读别人给你的回帖……

确实认真阅读了,目前只有版主的方法可以解决问题!
作者: 26933062     时间: 2007-10-20 22:43
5楼的输入有误???
我是按你顶楼的样本,输出结果也和你顶楼的一样啊?
误在哪里?  帖出来啊!
作者: 26933062     时间: 2007-10-20 22:56
你没说第6列有可能出现*号开头.
现在可以了.
加一个空格就ok了
作者: slore     时间: 2007-10-20 23:04


  Quote:
Originally posted by hbby at 2007-10-20 22:27:

确实认真阅读了,目前只有版主的方法可以解决问题!

可否指出我的方法哪里不能实现?
作者: hbby     时间: 2007-10-20 23:05
感谢各位的英雄帖!5楼为内部命令正解,版主为外部命令正解!谢谢各位!小弟结帖了!
作者: lxmxn     时间: 2007-10-22 00:53    标题: 还是sed比较简单,一句话搞定



  Quote:
sed "s/^\(\([^ ]\+ \+\)\{5\}\)\(\([^ ]\+ \+\)\{14\}\).*/\3/;s/[^ ]\{2,3\}/(&)/g;s/ //g" data.txt|sed -ne "/(.*)/w a.txt" -ne "/^[^()]*$/w b.txt"