中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-25 14:16
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 文本"纵列"如何转换为"横行"? 查看 2,300 回复 19
楼 主 文本"纵列"如何转换为"横行"? 发表于 2007-03-02 08:33 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
看第5楼

现有txt文件,是由findstr命令得到的

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 ]
2 发表于 2007-03-02 11:04 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
你着色有问题……

如果你:

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行的数据就有用。
3 发表于 2007-03-02 12:24 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  可以试试下面的代码:

@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 ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
ccwan +5 2007-03-02 21:51
xycoordinate +2 2007-03-02 21:53
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
4 发表于 2007-03-02 21:43 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
Originally posted by namejm at 2007-3-1 11:24 PM:
  可以试试下面的代码:

@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 ]
5 发表于 2007-03-02 21:45 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
findstr命令导出的文本,现在改变了一点:

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 ]
6 发表于 2007-03-02 22:01 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
应该没有什么问题吧,namejm的代码能够完成你的目的。修改一下好了。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
7 发表于 2007-03-02 22:05 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
Originally posted by ccwan at 2007-3-2 09:01 AM:
应该没有什么问题

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



[ Last edited by xycoordinate on 2007-3-2 at 10:11 AM ]
8 发表于 2007-03-02 23:22 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
你的要求怎么一直在改变啊?我刚刚完成了你的上一个要求你又更新了。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
9 发表于 2007-03-02 23:28 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
希望你不会再改变要求了。^_^
不行,格式有些偏差,等我再改改。
你的COM MOBILE:13855513825,冒号后没有空格,
UNI MOBILE: 13335555353,冒号后有空格,容易错误,不知是否你的疏忽?

[ Last edited by ccwan on 2007-3-2 at 11:33 PM ]
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
10 发表于 2007-03-02 23:48 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
Originally posted by ccwan at 2007-3-2 10:28:
希望你不会再改变要求了。^_^
不行,格式有些偏差,等我再改改。
你的COM MOBILE:13855513825,冒号后没有空格,
UNI MOBILE: 13335555353,冒号后有空格 ...

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

谢谢DG!

好眼力呀!
11 发表于 2007-03-02 23:53 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
这次的代码一定行了。代码如下
@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 条) 点击查看详情
评分人分数时间
xycoordinate +2 2007-03-03 00:13
附件
test.rar (417 bytes, 下载附件所需积分 1 点, 下载次数: 6)
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
12 发表于 2007-03-03 00:46 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
@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 ]
13 发表于 2007-03-03 04:06 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
165.txt

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

@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 ]
14 发表于 2007-03-03 05:36 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
靠!
原来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 ]
15 探讨1 发表于 2007-03-03 10:07 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
test.bat

@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

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

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 ]
论坛跳转: