中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 文本"纵列"如何转换为"横行"?
作者:
标题: 文本"纵列"如何转换为"横行"? 上一主题 | 下一主题
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 16 楼』:  探讨2 使用 LLM 解释/回答一下

str.bat

@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

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 ]


2007-3-3 10:20
查看资料  发送邮件  发短消息  网志  OICQ (226308607)  编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 17 楼』:  探讨3 使用 LLM 解释/回答一下

test.bat

@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

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

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 ]


2007-3-4 00:07
查看资料  发送邮件  发短消息  网志  OICQ (226308607)  编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 18 楼』:  修改一点 使用 LLM 解释/回答一下

增加对ACCEPTED的判断!

test2.bat

@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

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

DATE TYPE CUSTOM_NO CARD AMOUNT
20070104 UNI MOBILE 13305555353 6228790915000010566 100.00


如果用test.bat执行
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
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
结果:

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 ]


2007-3-4 07:56
查看资料  发送邮件  发短消息  网志  OICQ (226308607)  编辑帖子  回复  引用回复
minmin888
初级用户





积分 127
发帖 62
注册 2007-4-19
状态 离线
『第 19 楼』:   使用 LLM 解释/回答一下

这样写不是更好理解吗!!!


@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


2007-5-7 21:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 20 楼』:   使用 LLM 解释/回答一下

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

@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 ]


2007-5-16 20:16
查看资料  发送邮件  发短消息  网志  OICQ (226308607)  编辑帖子  回复  引用回复

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


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



论坛跳转: