Board logo

标题: 文本"纵列"如何转换为"横行"? [打印本页]

作者: xycoordinate     时间: 2007-3-2 08:33    标题: 文本"纵列"如何转换为"横行"?

看第5楼

现有txt文件,是由findstr命令得到的
[QUOTE]
20070101.txt:  MEQ 6228770015000125335  
20070102.txt:  MEQ 62232754000318918  
20070102.txt:  10:48 MEQ ACCEPTED
20070102.txt:AMOUNT=50.00
20070102.txt:  MTR 62232754000318918
20070102.txt:  10:48 MTR ACCEPTED

20070104.txt:  MEQ 6228790915000100566  
20070104.txt:  09:26 MEQ ACCEPTED
20070104.txt:AMOUNT=100.00
20070104.txt:  MTR 6228790915001000566  
20070104.txt:  09:26 MTR ACCEPTED

20070104.txt:  MEQ 6228790915001000566  
20070104.txt:  09:27 MEQ ACCEPTED
20070105.txt:  MEQ 6228791915000011110  
20070105.txt:  09:04 MEQ ACCEPTED
20070105.txt:AMOUNT=11.20
20070105.txt:  MTR 6228791915000111110  
20070105.txt:  09:05 MTR ACCEPTED


20070102.txt:AMOUNT=50.00
20070102.txt:  MTR 62232754000318918
20070102.txt:  10:48 MTR ACCEPTED

完整1笔交易!

如何用DOS命令过滤出来,生成文本:
DATE         CARD                            AMOUNT
20070102   62232754000318918      50.00
20070104   6228790915000100566  100.00
......

[ Last edited by xycoordinate on 2007-3-4 at 08:21 AM ]
作者: slore     时间: 2007-3-2 11:04
你着色有问题……

如果你:

20070101.txt:  MEQ 6228770015000025335  
20070102.txt:  MEQ 62232754000308918  
20070102.txt:  10:48 MEQ ACCEPTED
20070102.txt:AMOUNT=50.00
20070102.txt:  MTR 62232754000308918
20070102.txt:  10:48 MTR ACCEPTED

20070104.txt:  MEQ 6228790915000000566  
20070104.txt:  09:26 MEQ ACCEPTED
20070104.txt:AMOUNT=100.00
20070104.txt:  MTR 6228790915000000566  
20070104.txt:  09:26 MTR ACCEPTED

20070104.txt:  MEQ 6228790915000000566  
20070104.txt:  09:27 MEQ ACCEPTED
20070105.txt:  MEQ 6228791915000000110  
20070105.txt:  09:04 MEQ ACCEPTED
20070105.txt:AMOUNT=11.20
20070105.txt:  MTR 6228791915000000110  
20070105.txt:  09:05 MTR ACCEPTED


你看到什么规律了么?
for 分割后,AMOUNT存在那么后2行的数据就有用。
作者: namejm     时间: 2007-3-2 12:24
  可以试试下面的代码:
@echo off
setlocal enabledelayedexpansion
echo DATE         CARD                            AMOUNT
for /f "tokens=1,2* delims== " %%i in (test.txt) do (
    if !flag! equ 2 (
        echo !name!     !CARD!             !AMOUNT!
        set flag=
    )
    if !flag! equ 1 (
        set CARD=%%k  
        set CARD=!CARD:~0,19!
        set flag=2
    )
    set var=%%j
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )
)
pause
  精简了一下代码。

[ Last edited by namejm on 2007-3-2 at 09:08 AM ]
作者: xycoordinate     时间: 2007-3-2 21:43


  Quote:
Originally posted by namejm at 2007-3-1 11:24 PM:
  可以试试下面的代码:
[code]
@echo off
setlocal enabledelayedexpansion
echo DATE         CARD                            AMOUNT
for /f "tokens=1,2* delims== " %%i in ( ...

斑竹:
您能给XD解释一二吗?

主要是flag看不懂!!!

[ Last edited by xycoordinate on 2007-3-2 at 09:15 AM ]
作者: xycoordinate     时间: 2007-3-2 21:45
findstr命令导出的文本,现在改变了一点:

  Quote:
ncrlog\15615\20070101.txt:COM MOBILE:13965229365
ncrlog\15615\20070102.txt:COM MOBILE:13855573825
ncrlog\15615\20070102.txt:AMOUNT=50.00
ncrlog\15615\20070102.txt:  MTR 62232754000318918  
ncrlog\15615\20070102.txt:  10:48 MTR ACCEPTED

ncrlog\15615\20070104.txt:UNI MOBILE: 13305555353
ncrlog\15615\20070104.txt:AMOUNT=100.00
ncrlog\15615\20070104.txt:  MTR 6228790915001200566  
ncrlog\15615\20070104.txt:  09:26 MTR ACCEPTED

ncrlog\15615\20070112.txt:WATER:10213809
ncrlog\15615\20070112.txt:AMOUNT=9.60
ncrlog\15615\20070112.txt:  MTR 6228791915000044011  
ncrlog\15615\20070112.txt:  10:34 MTR ACCEPTED
ncrlog\15615\20070112.txt:GAS: 2009218582
ncrlog\15615\20070112.txt:AMOUNT=21.0
ncrlog\15615\20070112.txt:  MTR 6228791915000011011  
ncrlog\15615\20070112.txt:  10:36 MTR ACCEPTED

ncrlog\15615\20070126.txt:TELEPHONE:2741779
ncrlog\15615\20070126.txt:AMOUNT=29.00
ncrlog\15615\20070126.txt:  MTR 6228770015000211461  
ncrlog\15615\20070126.txt:  13:42 MTR ACCEPTED
ncrlog\15606\20070130.txt:ELEC: 40103644
ncrlog\15606\20070130.txt:AMOUNT=214.81
ncrlog\15606\20070130.txt:  MTR 62232754000661168  
ncrlog\15606\20070130.txt:  16:41 MTR ACCEPTED

总共有6个交易TYPE
UNI MOBILE
COM MOBILE
TELEPHONE
GAS
WATER
ELEC

只有UNI MOBILE后面冒号(:)与CUSTOM_NO之间有空格!



DATE         TYPE           CUSTOM_NO     CARD                          AMOUNT
20070102  COM MOBILE  13855573825 62232754000312918      50.00
20070104  UNI MOBILE   13305555353 6228790915001200566  100.00
。。。。。。

[ Last edited by xycoordinate on 2007-3-3 at 09:04 PM ]
作者: ccwan     时间: 2007-3-2 22:01
namejm
作者: xycoordinate     时间: 2007-3-2 22:05


  Quote:
Originally posted by ccwan at 2007-3-2 09:01 AM:
题[/col ...

他写得太深奥了,我根本看不懂,怎么修改呀!?



[ Last edited by xycoordinate on 2007-3-2 at 10:11 AM ]
作者: ccwan     时间: 2007-3-2 23:22

作者: ccwan     时间: 2007-3-2 23:28
希望你不会再改变要求了。^_^
不行,格式有些偏差,等我再改改。
你的COM MOBILE:13855513825,冒号后没有空格,
      UNI MOBILE: 13335555353,冒号后有空格,容易错误,不知是否你的疏忽?

[ Last edited by ccwan on 2007-3-2 at 11:33 PM ]
作者: xycoordinate     时间: 2007-3-2 23:48


  Quote:
Originally posted by ccwan at 2007-3-2 10:28:
希望你不会再改变要求了。^_^
不行,格式有些偏差,等我再改改。
你的COM MOBILE:13855513825,冒号后没有空格,
      UNI MOBILE: 13335555353,冒号后有空格 ...

这是ATM的流水日志,我用findstr命令过滤生成的就是这样!
可能是ATM厂家在编写程序时的疏忽!!

谢谢DG!

好眼力呀!
作者: ccwan     时间: 2007-3-2 23:53
这次的代码一定行了。代码如下
@echo off
setlocal enabledelayedexpansion
echo DATE          TYPE                CUSTOM_NO        CARD                        AMOUNT
for /f "tokens=1,2,3 delims== " %%i in (test.txt) do (
    if !flag! equ 2 (
        echo !name!  !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
    )
    if !flag! equ 1 (
        set CARD=%%k  
        set CARD=!CARD:~0,19!
        set flag=2
    )
    set str=%%i
    set var=%%j
    if "!var:~0,3!"=="MOB" (
        set TYPE=!str:~-3,3! !var:~0,6!
        set CUSTOM_NO=!var:~-11,11!
        if "!TYPE:~0,3!"=="UNI" set CUSTOM_NO=%%k
    )
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )   
)
pause
考虑到格式可能不整齐,附上附件
附件 1: test.rar (2007-3-2 23:53, 417 bytes, 下载附件所需积分 1点 ,下载次数: 6)

作者: xycoordinate     时间: 2007-3-3 00:46
@echo off
setlocal enabledelayedexpansion
echo DATE          TYPE                CUSTOM_NO        CARD                        AMOUNT
for /f "tokens=1,2,3 delims== " %%i in (test.txt) do (
    if !flag! equ 2 (
        echo !name!  !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
    )
    if !flag! equ 1 (
        set CARD=%%k  
        set CARD=!CARD:~0,19!
        set flag=2
    )
    set str=%%i
    set var=%%j
    if "!var:~0,3!"=="MOB" (
        set TYPE=!str:~-3,3! !var:~0,6!
        set CUSTOM_NO=!var:~-11,11!
        if "!TYPE:~0,3!"=="UNI" set CUSTOM_NO=%%k
    )

    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )  
)
红色的地方需要修改,

总共有6个交易TYPE
UNI MOBILE
COM MOBILE
TELEPHONE
GAS
WATER
ELEC

只有UNI MOBILE后面冒号(:)与CUSTOM_NO之间有空格!

呜呜呜。。。。。。
我又犯错了!

ncrlog\15615\20070112.txt:WATER:10213809
ncrlog\15615\20070112.txt:AMOUNT=9.60
ncrlog\15615\20070112.txt:  MTR 6228791915000011011  
ncrlog\15615\20070112.txt:  10:34 MTR ACCEPTED

ncrlog\15615\20070112.txt:GAS: 2009218582
ncrlog\15615\20070112.txt:AMOUNT=21.0
ncrlog\15615\20070112.txt:  MTR 6228791915000011011  
ncrlog\15615\20070112.txt:  10:36 MTR ACCEPTED

ncrlog\15615\20070126.txt:TELEPHONE:2761779
ncrlog\15615\20070126.txt:AMOUNT=29.00
ncrlog\15615\20070126.txt:  MTR 6228770015000121461  
ncrlog\15615\20070126.txt:  13:42 MTR ACCEPTED

ncrlog\15606\20070130.txt:ELEC: 40103644
ncrlog\15606\20070130.txt:AMOUNT=214.81
ncrlog\15606\20070130.txt:  MTR 62232754000121168  
ncrlog\15606\20070130.txt:  16:41 MTR ACCEPTED

这次不好麻烦DX了,我只好自己更改了!

[ Last edited by xycoordinate on 2007-3-3 at 09:04 PM ]
作者: xycoordinate     时间: 2007-3-3 04:06
165.txt

  Quote:
ncrlog\15600\20070111.txt:COM MOBILE:13705553116
ncrlog\15600\20070111.txt:AMOUNT=100.00
ncrlog\15600\20070111.txt:  MTR 62232754000617668  
ncrlog\15600\20070111.txt:  15:04 MTR ACCEPTED

ncrlog\15615\20070104.txt:UNI MOBILE: 13305555353
ncrlog\15615\20070104.txt:AMOUNT=100.00
ncrlog\15615\20070104.txt:  MTR 6228790915002300566  
ncrlog\15615\20070104.txt:  09:26 MTR ACCEPTED

ncrlog\15600\20070109.txt:TELEPHONE:2212834
ncrlog\15600\20070109.txt:AMOUNT=73.00
ncrlog\15600\20070109.txt:  MTR 62287909150000112760  
ncrlog\15600\20070109.txt:  10:39 MTR ACCEPTED

ncrlog\15615\20070112.txt:WATER:10213809
ncrlog\15615\20070112.txt:AMOUNT=9.60
ncrlog\15615\20070112.txt:  MTR 6228791915001100011  
ncrlog\15615\20070112.txt:  10:34 MTR ACCEPTED

ncrlog\15606\20070130.txt:ELEC: 40103644
ncrlog\15606\20070130.txt:AMOUNT=214.81
ncrlog\15606\20070130.txt:  MTR 62232754000623168  
ncrlog\15606\20070130.txt:  16:41 MTR ACCEPTED

ncrlog\15615\20070112.txt:GAS: 2009218582
ncrlog\15615\20070112.txt:AMOUNT=21.0
ncrlog\15615\20070112.txt:  MTR 6228791915000110011  
ncrlog\15615\20070112.txt:  10:36 MTR ACCEPTED

test.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
for /f "tokens=1,2,3 delims== " %%i in (%1) do (
    if !flag! equ 2 (
        echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
    )
    if !flag! equ 1 (
        set CARD=%%k  
rem        set CARD=!CARD:~0,19!
        set flag=2
    )

    set str=%%i
    set var=%%j
rem MOBILE
    if "!var:~0,6!"=="MOBILE" (
        set TYPE=!str:~-3,3! MOBILE
        set CUSTOM_NO=!var:~-11!
        if "!TYPE:~0,3!"=="UNI" set CUSTOM_NO=%%k
    )

rem +++++++++++++++++++++++++++++

rem TELEPHONE
    if "!str:~-17,9!"=="TELEPHONE" (
        set TYPE=TELEPHONE
        set CUSTOM_NO=!str:~-7!
    )
rem WATER
    if "!str:~-14,5!"=="WATER" (
        set TYPE=WATER
        set CUSTOM_NO=!str:~-8!
    )
rem ELEC
    if "!str:~-5,4!"=="ELEC" (
        set TYPE=ELEC
        set CUSTOM_NO=!var!
   )
rem GAS
   if "!str:~-4,3!"=="GAS" (
        set TYPE=GAS
        set CUSTOM_NO=!var!
   )


rem +++++++++++++++++++++++++++++

    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )   
)

CMD:
E:\>test.bat 156.txt
DATE    TYPE    CUSTOM_NO       CARD    AMOUNT
20070111        COM MOBILE      13785553216     62232754000719668       100.00
20070104        UNI MOBILE      13305555353     6228790915000000566     100.00
20070109        TELEPHONE       2212834 6228790915012002760     73.00
20070112        WATER   10213809        6228791915000110011     9.60
20070130        ELEC    40103644        62232754000623168       214.81


为什么呀?
就GAS项目不显示???
大家能帮我看看吗?

[ Last edited by xycoordinate on 2007-3-3 at 10:01 PM ]
作者: xycoordinate     时间: 2007-3-3 05:36
靠!
原来GAS的AMOUNT格式都是“**.*
ncrlog\15615\20070112.txt:GAS: 2009218582
ncrlog\15615\20070112.txt:AMOUNT=21.0
ncrlog\15615\20070112.txt:  MTR 6228791915000000011  
ncrlog\15615\20070112.txt:  10:36 MTR ACCEPTED

只要在test.bat里加一点,就OK了!
    if "!var:~-2,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )

万分感谢:
namejm
ccwan


[ Last edited by xycoordinate on 2007-3-2 at 04:38 PM ]
作者: xycoordinate     时间: 2007-3-3 10:07    标题: 探讨1

test.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
for /f "tokens=1,2,3 delims==, " %%i in (%1) do (
    if !flag! equ 2 (
        echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
         echo 1 %%i %%j %%k
    )
    if !flag! equ 1 (
        set CARD=%%k
        set flag=2
        echo 2 %%i %%j %%k
    )
    set str=%%i
    set var=%%j

rem MOBILE
    if "!var:~0,6!"=="MOBILE" (
        set TYPE=!str:~-3,3! MOBILE
        set CUSTOM_NO=!var:~-11!
    echo 3 %%i %%j %%k
    )

    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    echo 4 %%i %%j %%k
    )   

)

111.txt

  Quote:
ncrlog\15600\20070111.txt:COM MOBILE:13705553216
ncrlog\15600\20070111.txt:AMOUNT=100.00
ncrlog\15600\20070111.txt:  MTR 62232754000719668  
ncrlog\15600\20070111.txt:  15:04 MTR ACCEPTED

E:\>testmiddle.bat 111.txt >111new.txt

111new.txt

  Quote:
DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
3 ncrlog\15600\20070111.txt:COM MOBILE:13705553216
4 ncrlog\15600\20070111.txt:AMOUNT 100.00
2 ncrlog\15600\20070111.txt: MTR 62232754000719668
20070111        COM MOBILE        13705553216        62232754000719668        100.00
1 ncrlog\15600\20070111.txt: 15:04 MTR

111new.txt显示的顺序与111.txt的一致.
for命令是一行一行扫描文本!

现在探讨一下,执行test.bat时的步骤:
第1步:
    if "!var:~0,6!"=="MOBILE" (
        set TYPE=!str:~-3,3! MOBILE
        set CUSTOM_NO=!var:~-11!
   )
第2步:
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
   )
第3步:
    if !flag! equ 1 (
        set CARD=%%k
        set flag=2
   )
第4步:
   if !flag! equ 2 (
        echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
    )

[ Last edited by xycoordinate on 2007-3-3 at 10:43 AM ]
作者: xycoordinate     时间: 2007-3-3 10:20    标题: 探讨2

str.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3 delims==, " %%i in (%1) do (
set str1=%%i
set str2=%%j
set str3=%%k

set str1
set str2
set str3
)

E:\>str.bat 111.txt
显示:
str1=ncrlog\15600\20070111.txt:COM
str2=MOBILE:13705553216
环境变量 str3 没有定义

str1=ncrlog\15600\20070111.txt:AMOUNT
str2=100.00
环境变量 str3 没有定义
str1=ncrlog\15600\20070111.txt:
str2=MTR
str3=62232754000719668

str1=ncrlog\15600\20070111.txt:
str2=15:04
str3=MTR


"for /f "tokens=1,2,3 delims==, " %%i in (%1) do"
for命令扫描111.txt的1行,赋值一次%%i, %%j, %%k,

结果正好与111new.txt显示顺序对应.
111new.txt

  Quote:
DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
3 ncrlog\15600\20070111.txt:COM MOBILE:13705553216
4 ncrlog\15600\20070111.txt:AMOUNT 100.00
2 ncrlog\15600\20070111.txt: MTR 62232754000719668
20070111        COM MOBILE        13705553216        62232754000719668        100.00
1 ncrlog\15600\20070111.txt: 15:04 MTR

[ Last edited by xycoordinate on 2007-5-16 at 10:14 PM ]
作者: xycoordinate     时间: 2007-3-4 00:07    标题: 探讨3

test.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
for /f "tokens=1,2,3 delims==, " %%i in (%1) do (

rem START

rem A++++++++++++++++++++   
    if !flag! equ 2 (
        echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
         echo 1 %%i %%j %%k
    )
rem A++++++++++++++++++++

rem B++++++++++++++++++++   
    if !flag! equ 1 (
        set CARD=%%k
        set flag=2
        echo 2 %%i %%j %%k
    )
    set str=%%i
    set var=%%j
rem B++++++++++++++++++++

rem C++++++++++++++++++++      
rem MOBILE
    if "!var:~0,6!"=="MOBILE" (
        set TYPE=!str:~-3,3! MOBILE
        set CUSTOM_NO=!var:~-11!
    echo 3 %%i %%j %%k
    )
rem C++++++++++++++++++++

rem D++++++++++++++++++++      
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    echo 4 %%i %%j %%k
    )   
rem D++++++++++++++++++++

rem END   

)

111.txt

  Quote:
ncrlog\15600\20070111.txt:COM MOBILE:13705553216
ncrlog\15600\20070111.txt:AMOUNT=100.00
ncrlog\15600\20070111.txt:  MTR 62232754000719668  
ncrlog\15600\20070111.txt:  15:04 MTR ACCEPTED

E:\>testmiddle.bat 111.txt

  Quote:
DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
3 ncrlog\15600\20070111.txt:COM MOBILE:13705553216
4 ncrlog\15600\20070111.txt:AMOUNT 100.00
2 ncrlog\15600\20070111.txt: MTR 62232754000719668
20070111        COM MOBILE        13705553216        62232754000719668        100.00
1 ncrlog\15600\20070111.txt: 15:04 MTR

探讨:
for命令
扫描111.txt中的第1行时,test.bat中C部分符合条件,执行C,到END再返回START;
扫描111.txt中的第2行时,test.bat中D部分符合条件,执行D,到END再返回START;
扫描111.txt中的第3行时,test.bat中B部分符合条件,执行B,到END再返回START;
扫描111.txt中的第4行时,test.bat中A部分符合条件,执行A,到END再返回START.

for命令是一行一行地扫描文本文件,for命令体(START到END之间)中的语句是按顺序执行.

[ Last edited by xycoordinate on 2007-5-16 at 06:23 PM ]
作者: xycoordinate     时间: 2007-3-4 07:56    标题: 修改一点

增加对ACCEPTED的判断!

test2.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
for /f "tokens=1,2,* delims==, " %%i in (%1) do (
    set str1=%%i
    set str2=%%j
    set str3=%%k

    if !flag! equ 2 (
       if "!str3:~-8!"=="ACCEPTED" (
              echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        )     
        set flag=
    )
    if !flag! equ 1 (

        set CARD=!str3!
        set flag=2
    )

rem MOBILE
    if "!str2:~0,6!"=="MOBILE" (
        set TYPE=!str1:~-3,3! MOBILE
        set CUSTOM_NO=!str2:~-11!
        if "!TYPE:~0,3!"=="UNI" set CUSTOM_NO=!str3!
    )

rem TELEPHONE
    if "!str1:~-17,9!"=="TELEPHONE" (
        set TYPE=TELEPHONE
        set CUSTOM_NO=!str1:~-7!
    )
rem WATER
    if "!str1:~-14,5!"=="WATER" (
        set TYPE=WATER
        set CUSTOM_NO=!str1:~-8!
    )
rem ELEC
    if "!str1:~-5,4!"=="ELEC" (
        set TYPE=ELEC
        set CUSTOM_NO=!str2:~-8!
   )
rem GAS
   if "!str1:~-4,3!"=="GAS" (
        set TYPE=GAS
        set CUSTOM_NO=!str2:~-10!
   )

    if "!str2:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=!str2!
        set flag=1
    )
rem GAS AMOUNT format: "**.*"
    if "!str2:~-2,1!"=="." (
        set name=%%~ni
        set AMOUNT=!str2!
        set flag=1
    )
)

123.txt

  Quote:
ncrlog\15600\20070111.txt:COM MOBILE:13715553216
ncrlog\15600\20070111.txt:AMOUNT=100.00
ncrlog\15600\20070111.txt:  MTR 62232754001719668  
ncrlog\15600\20070111.txt:  15:04 MTR
ncrlog\15600\20070109.txt:TELEPHONE:2202834
ncrlog\15600\20070109.txt:AMOUNT=73.00
ncrlog\15600\20070109.txt:  MTR 6228790915000112760  

ncrlog\15615\20070104.txt:UNI MOBILE: 13305555353
ncrlog\15615\20070104.txt:AMOUNT=100.00
ncrlog\15615\20070104.txt:  MTR 6228790915000010566  
ncrlog\15615\20070104.txt:  09:26 MTR ACCEPTED
ncrlog\15615\20070112.txt:WATER:10213819
ncrlog\15615\20070112.txt:AMOUNT=9.60
ncrlog\15615\20070112.txt:  MTR 6228791915000010211  

test2.bat 123.txt

  Quote:
DATE    TYPE    CUSTOM_NO       CARD    AMOUNT
20070104        UNI MOBILE      13305555353     6228790915000010566     100.00

如果用test.bat执行
test.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE        TYPE        CUSTOM_NO        CARD        AMOUNT
for /f "tokens=1,2,3 delims==, " %%i in (%1) do (
    if !flag! equ 2 (
        echo !name!        !TYPE!        !CUSTOM_NO!        !CARD!        !AMOUNT!
        set flag=
    )
    if !flag! equ 1 (
        set CARD=%%k
        set flag=2
    )
    set str=%%i
    set var=%%j
rem MOBILE
    if "!var:~0,6!"=="MOBILE" (
        set TYPE=!str:~-3,3! MOBILE
        set CUSTOM_NO=!var:~-11!
        if "!TYPE:~0,3!"=="UNI" set CUSTOM_NO=%%k
    )
rem TELEPHONE
    if "!str:~-17,9!"=="TELEPHONE" (
        set TYPE=TELEPHONE
        set CUSTOM_NO=!str:~-7!
    )
rem WATER
    if "!str:~-14,5!"=="WATER" (
        set TYPE=WATER
        set CUSTOM_NO=!str:~-8!
    )
rem ELEC
    if "!str:~-5,4!"=="ELEC" (
        set TYPE=ELEC
        set CUSTOM_NO=!var:~-8!
   )
rem GAS
   if "!str:~-4,3!"=="GAS" (
        set TYPE=GAS
        set CUSTOM_NO=!var:~-10!
   )

    if "!var:~-2,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )   
)

test.bat 123.txt
结果:

  Quote:
DATE    TYPE    CUSTOM_NO       CARD    AMOUNT
20070111        COM MOBILE      13715553216     62232754001719668       100.00
20070109        TELEPHONE       2202834 6228790915000112760     73.00
20070104        UNI MOBILE      13305555353     6228790915000010566     100.00

如果,不做ACCEPTED条件的判断,没有ACCEPTED的将不显示!!!
特别地交易2(TELEPHONE)与交易3(WATER)的结果就不同!
而且如果将2,3位置颠倒,显示的结果就会不同!!!


[ Last edited by xycoordinate on 2007-3-4 at 08:25 AM ]
作者: minmin888     时间: 2007-5-7 21:34
这样写不是更好理解吗!!!


@echo off
setlocal enabledelayedexpansion
echo DATE         CARD                            AMOUNT
for /f "tokens=1,2* delims== " %%i in (test.txt) do (
    set var=%%j
    if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )

    if !flag! equ 1 (
        set CARD=%%k  
        set CARD=!CARD:~0,19!
        set flag=2
    )

    if !flag! equ 2 (
        echo !name!     !CARD!             !AMOUNT!
        set flag=
    )

)
pause
作者: xycoordinate     时间: 2007-5-16 20:16
19楼,讲得对"上面的写法理解是不大好",不过只是简单地改变上下顺序是不行的!需要修改内容!
而且是"namejm"斑竹帮忙想出来,我就只好尊重他的写法了!

test.txt
ncrlog\15600\20070111.txt:COM MOBILE:13705553216
ncrlog\15600\20070111.txt:AMOUNT=100.00
ncrlog\15600\20070111.txt:  MTR 62232754000719668  
ncrlog\15600\20070111.txt:  15:04 MTR ACCEPTED

执行你的bat,得到的是:
DATE         CARD                            AMOUNT
20070111                    100.00

for扫描test.txt,第1行不满足,pass!

只有test.txt第2行中,
ncrlog\15600\20070111.txt:AMOUNT=100.00
满足for命令中条件,
if "!var:~-3,1!"=="." (
        set name=%%~ni
        set AMOUNT=%%j
        set flag=1
    )
for命令顺序执行下面的行,显示出来,
但是,for继续扫描第3,4行,不满足条件,所以,不能取到!CARD!的值!

修改19楼的bat文件
test.bat

  Quote:
@echo off
setlocal enabledelayedexpansion
echo DATE         CUSTOM_NO        CARD                            AMOUNT
for /f "tokens=1,2* delims== " %%i in (%1) do (
  set sub=%%i
  set var=%%j

  if "!sub:~-3,3!"=="COM" (
    set TYPE=COM
    set CUSTOM_NO=!var:~7!
  )

  if "!var:~-3,1!"=="." (
    set name=%%~ni
    set AMOUNT=%%j
  )

  if "%%j"=="MTR" (
    set CARD=%%k  
    set CARD=!CARD:~0,19!
    set flag=1
  )

  if "%%k"=="MTR ACCEPTED" (
    set flag=2
  )

  if !flag! equ 2 (
    echo !name!     !CUSTOM_NO!        !CARD!             !AMOUNT!
    set flag=
  )

)
pause

执行
test.bat test.txt
得到:
DATE         CUSTOM_NO  CARD                            AMOUNT
20070111     13705553216        62232754000719668               100.00
请按任意键继续. . .

[ Last edited by xycoordinate on 2007-5-16 at 10:40 PM ]