中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 用批处理列举水产品的最低、最高价
作者:
标题: 用批处理列举水产品的最低、最高价 上一主题 | 下一主题
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『楼 主』:  用批处理列举水产品的最低、最高价 使用 LLM 解释/回答一下

在附件中的a.txt内,有着很多种水产品的单价,(详情请下载后看看)
现在该如何列举每种水产品的最高价和最低价呢?

要求输出格式如下:
虹鳟鱼:

最低价: 青岛城阳 34.00
最高价: 闽福鼎农贸 80.00

活鳜鱼:

最低价: 北京新发地 24.00
最高价: 北京八里桥 26.00


对于只有一个单价或价格一样的可以这样:
虹鳟鱼:

最低价: 闽福鼎农贸 80.00
最高价: 闽福鼎农贸 80.00

活鳜鱼:

最低价: 北京新发地 26.00
最高价: 北京八里桥 26.00


Last edited by ccwan on 2007-1-10 at 06:35 AM ]


附件 1: a.txt (2007-1-10 06:32, 11.22 KiB, 下载附件所需积分 1 点 ,下载次数: 49)


三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-1-10 06:32
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

也来试试:

@echo off
setlocal enabledelayedexpansion

for /f "tokens=1,2,3" %%i in (a.txt) do (
if not defined %%j (
set a=
set %%j=A
set/a b+=1
set str!b!=%%j)
set/a a+=1
set MP_%%j!a!=%%i=%%k
)
for /l %%i in (1 1 %b%) do (
set Hprice=
for /f "tokens=2,3 delims==" %%a in ('set MP_!str%%i!') do (
set tmp=%%b
set tmp=!tmp:.=!
if not defined Hprice (
set/a Hprice=!tmp! & set/a Lprice=!tmp!
set Hmarcket=%%a & set Lmarcket=%%a
) else (
if !tmp! GEQ !Hprice! set/a Hprice=!tmp! & set Hmarcket=%%a
if !tmp! LEQ !Lprice! set/a Lprice=!tmp! & set Lmarcket=%%a)
)
echo !str%%i!:
echo.
echo 最高价: !Hmarcket! !Hprice:~0,-2!.!Hprice:~-2!
echo 最低价: !Lmarcket! !Lprice:~0,-2!.!Lprice:~-2!
echo.
)
pause>nul


Last edited by youxi01 on 2007-1-10 at 08:25 AM ]


   此帖被 +10 点积分      点击查看详情   
评分人:【 redtek 分数: +5  时间:2007-1-10 08:10
评分人:【 ccwan 分数: +5  时间:2007-1-10 20:48


2007-1-10 07:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

  演示代码如下:

@echo off
:: 当最高价和最低价相同时,产地将指向同一个地方,而不管同样的价格有几个产地
:: 并且这个产地在表中位于这类产品的最后
set max=1
set min=50000
setlocal enabledelayedexpansion
for /f "tokens=1-3" %%i in (a.txt) do (
set class1=!class2!
set class2=%%j&set price=%%k
set price=!price:.=!
if defined class1 if not "!class1!"=="!class2!" (
call :echo_
set max=1
set min=50000
)
if !price! geq !max! set max=!price!&set addr_max=%%i
if !price! leq !min! set min=!price!&set addr_min=%%i
)
call ::echo_
pause
goto :eof

:echo_
echo !class1!:
echo.
echo 最低价: !addr_min! !min:~0,-2!.!min:~-2!
echo 最高价: !addr_max! !max:~0,-2!.!max:~-2!
echo.
goto :eof


Last edited by namejm on 2007-1-9 at 07:00 PM ]


   此帖被 +14 点积分      点击查看详情   
评分人:【 redtek 分数: +5  时间:2007-1-10 08:10
评分人:【 ccwan 分数: +7  时间:2007-1-10 20:48
评分人:【 boluor 分数: +2  时间:2007-1-13 13:35




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-10 07:54
查看资料  发短消息  网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

TO nameJM:
斑竹就是斑竹,看了你的代码真是惭愧啊。我开始的时候还去定义鱼的种类,真是多此一举啊!

还有一个问题就是,我修改之后怎么我的帖子怎么成了2F了,原来是3F的哦!


2007-1-10 08:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

Originally posted by youxi01 at 2007-1-9 19:00:
斑竹就是斑竹,看了你的代码真是惭愧啊。我开始的时候还去定义鱼的种类,真是多此一举啊!
还有一个问题就是,我修改之后怎么我的帖子怎么成了2F了,原来是3F的哦!

  我的代码存在一点瑕疵,具体看我代码里的说明。另外,你的代码有点问题,不知道你仔细查看了运行后的结果了没有。<img src="images/smilies/face-raspberry.png" align="absmiddle" border="0">

  呵呵,因为我操作不慎,编辑帖子的时候,误点了删除,导致我发在2楼的帖子被删掉了-_-|

Last edited by namejm on 2007-1-9 at 07:08 PM ]




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-10 08:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

精彩!!!欣赏~~~
上面那两种鱼我都没吃过:(  ~~口水直流~~````




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-1-10 08:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

Originally posted by namejm at 2007-1-10 08:04 AM:

  我的代码存在一点瑕疵,具体看我代码里的说明。另外,你的代码有点问题,不知道你仔细查看了运行后的结果了没有。:P

  呵呵,因为我 ...

你提出的问题,我写的也没有考虑,其它的还没看到?


2007-1-10 08:12
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

  那我提示一下:在最后那几种产品中,产地显示有错误,应该是你没有注意清空变量导致的。




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-10 08:17
查看资料  发短消息  网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

呵呵,看到了,谢谢,已改正!


2007-1-10 08:26
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

真是太棒了!欣赏~~




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-1-10 20:50
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

  以下代码能罗列所有的最高价和最低价记录,但是效率比较低下,并且还生成了临时文件:

@echo off

set num=0
md tmp 2>nul
setlocal enabledelayedexpansion

:: 按水产品类别建立临时文件
for /f "tokens=1-3" %%i in (a.txt) do (
set class1=!class2!
set class2=%%j
set price=%%k
if not defined class1 set /a num+=1&cd.>tmp\!num!.txt
if defined class1 if not "!class1!"=="!class2!" (
set /a num+=1&cd.>tmp\!num!.txt
echo !price:.=!☆ %%i %%j %%k>>tmp\!num!.txt
) else echo !price:.=!☆ %%i %%j %%k>>tmp\!num!.txt
)

set num=1

:loop
echo.

:: 获取最低价记录
set switch_sort=
set switch_class=
set switch_H_or_L=0
set price1=&set price2=
set H_or_L=最低价:
set str=
for /l %%i in (1,1,3) do (
set str=!str!
if !switch_H_or_L! equ 0 call :sort_ !str!
)

:: 获取最高价记录
set switch_sort=/r
set switch_H_or_L=0
set price1=&set price2=
set H_or_L=最高价:
set str=
for /l %%i in (1,1,3) do (
set str=!str:*]=!
if !switch_H_or_L! equ 0 call :sort_ !str!
)
echo ______________________________

set /a num+=1
if exist tmp\%num%.txt goto loop

endlocal
rd /q /s tmp
pause
goto :eof


:sort_
:: 按由高到低/由低到高排序
for /f "tokens=1-4" %%i in ('findstr "^%1☆" tmp\%num%.txt^|sort %switch_sort%') do (
set price1=!price2!
set price2=%%i
if not defined switch_class echo %%k:&echo.&set switch_class=1
if not defined price1 (echo %H_or_L% %%j %%l&set switch_H_or_L=1) else (
if "!price1!"=="!price2!" (
echo %H_or_L% %%j %%l
) else goto :eof
)
)
goto :eof


   此帖被 +14 点积分      点击查看详情   
评分人:【 ccwan 分数: +7  时间:2007-1-12 04:30
评分人:【 redtek 分数: +7  时间:2007-1-12 23:08




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-12 03:57
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

临时文件没关系,重要的是解决了问题。




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-1-12 04:31
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

结果和 11 楼 namejm 版主的一样,也是效率较低,但不用生成临时文件。



::zh159@bbs.cn-dos.net 2007-1-11
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1-3" %%i in (a.txt) do set $%%i %%j %%k=$
for /f "tokens=1-2" %%i in (a.txt) do if not "%%j" == "!Type!" set Type=%%j&&call :Scan %%j
pause
exit

:Scan
set Min=1000000
set Max=0
for /f "tokens=1-3* delims==$ " %%i in ('set $^|find "%1"') do (
set num=%%k&&set num=!num:.=!
if !num! LEQ !Min! set Min=!num!
if !num! GEQ !Max! set Max=!num!
)
echo %1:
echo.
for /f "tokens=1-3* delims==$ " %%i in ('set $^|find "%1"') do set num=%%k&&set num=!num:.=!&&if "!num!" == "!Min!" echo 最低价: %%i %%k
for /f "tokens=1-3* delims==$ " %%i in ('set $^|find "%1"') do set num=%%k&&set num=!num:.=!&&if "!num!" == "!Max!" echo 最高价: %%i %%k
echo.------------------------------
goto :eof


Last edited by zh159 on 2007-1-11 at 11:45 PM ]


   此帖被 +14 点积分      点击查看详情   
评分人:【 ccwan 分数: +7  时间:2007-1-12 21:03
评分人:【 redtek 分数: +7  时间:2007-1-12 23:09


2007-1-12 12:42
查看资料  发短消息  网志   编辑帖子  回复  引用回复
tuesposo
初级用户





积分 68
发帖 28
注册 2006-12-29
状态 离线
『第 14 楼』:   使用 LLM 解释/回答一下

好东西啊


2007-1-12 21:28
查看资料  发短消息  网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 15 楼』:   使用 LLM 解释/回答一下

修改了一下,提高了效率,也不用生成临时文件。

::zh159@bbs.cn-dos.net 2007-1-13
@echo off
title 水产最低价^&最高价 zh159@bbs.cn-dos.net 2007-1-13
setlocal EnableDelayedExpansion
for /f "tokens=1-3*" %%i in (a.txt) do set %%j.%%i.%%k=.
for /f "tokens=1-3*" %%i in (a.txt) do if not "%%j" == "!Type!" set Type=%%j&&call :Scan %%j
pause
exit

:Scan
set Min=M
set Max=0
for /f "tokens=1-4* delims==." %%i in ('set "%1"') do (
if %%k%%l LEQ !Min! set Min=%%k%%l
if %%k%%l GEQ !Max! set Max=%%k%%l
)
echo %1:
echo.
for /f "tokens=1-4* delims==." %%i in ('set "%1"') do if "%%k%%l" == "%Min%" echo 最低价: %%j %%k.%%l
for /f "tokens=1-4* delims==." %%i in ('set "%1"') do if "%%k%%l" == "%Max%" echo 最高价: %%j %%k.%%l
echo.------------------------------
goto :eof


   此帖被 +15 点积分     点击查看详情   
评分人:【 namejm 分数: +8  时间:2007-1-14 01:16
评分人:【 ccwan 分数: +7  时间:2007-1-14 01:38


2007-1-13 23:54
查看资料  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: