中国DOS联盟论坛

中国DOS联盟

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

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

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




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

在附件中的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 K, 下载附件所需积分 1 点 ,下载次数: 49)


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




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 2 楼』:  

也来试试:
@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 楼』:  

  演示代码如下:
@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 楼』:  

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

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

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

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  



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

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

  呵呵,因为我操作不慎,编辑帖子的时候,误点了删除,导致我发在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 楼』:  

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



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

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




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 7 楼』:  



  Quote:
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 楼』:  

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



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




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 9 楼』:  

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

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




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 10 楼』:  

真是太棒了!欣赏~~



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

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 11 楼』:  

  以下代码能罗列所有的最高价和最低价记录,但是效率比较低下,并且还生成了临时文件:
@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=[0-9][0-9]
for /l %%i in (1,1,3) do (
    set str=!str![0-9]
    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=[0-9][0-9][0-9][0-9][0-9][0-9]
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 楼』:  

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



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




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 13 楼』:  

结果和 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 楼』:  

好东西啊

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




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 15 楼』:  

修改了一下,提高了效率,也不用生成临时文件。
::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
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: