Board logo

标题: 用批处理列举水产品的最低、最高价 [打印本页]

作者: ccwan     时间: 2007-1-10 06:32    标题: 用批处理列举水产品的最低、最高价

在附件中的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)

作者: youxi01     时间: 2007-1-10 07:54
也来试试:
@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 ]
作者: namejm     时间: 2007-1-10 07:54
  演示代码如下:
@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 ]
作者: youxi01     时间: 2007-1-10 08:00
TO nameJM:
斑竹就是斑竹,看了你的代码真是惭愧啊。我开始的时候还去定义鱼的种类,真是多此一举啊!

还有一个问题就是,我修改之后怎么我的帖子怎么成了2F了,原来是3F的哦!
作者: namejm     时间: 2007-1-10 08:04


  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 ]
作者: redtek     时间: 2007-1-10 08:08
精彩!!!欣赏~~~
上面那两种鱼我都没吃过:(  ~~口水直流~~````
作者: youxi01     时间: 2007-1-10 08:12


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

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

  呵呵,因为我 ...

你提出的问题,我写的也没有考虑,其它的还没看到?
作者: namejm     时间: 2007-1-10 08:17
  那我提示一下:在最后那几种产品中,产地显示有错误,应该是你没有注意清空变量导致的。
作者: youxi01     时间: 2007-1-10 08:26
呵呵,看到了,谢谢,已改正!
作者: ccwan     时间: 2007-1-10 20:50
真是太棒了!欣赏~~
作者: namejm     时间: 2007-1-12 03:57
  以下代码能罗列所有的最高价和最低价记录,但是效率比较低下,并且还生成了临时文件:
@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

作者: ccwan     时间: 2007-1-12 04:31
临时文件没关系,重要的是解决了问题。
作者: zh159     时间: 2007-1-12 12:42
结果和 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 ]
作者: tuesposo     时间: 2007-1-12 21:28
好东西啊
作者: zh159     时间: 2007-1-13 23:54
修改了一下,提高了效率,也不用生成临时文件。
::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

作者: namejm     时间: 2007-1-14 01:15
  13楼和15楼的代码思路确实不错。但是在 for 语句中使用管道会使速度降低不少,15楼抛弃了管道操作,速度马上上去了。

  本来想发一段在13楼的基础上修正的代码,速度控制在15S以内,不过比起15楼的速度,还是稍微慢了点,就不发了。加分。
作者: zh159     时间: 2007-1-16 05:06
以下两个都产生临时文件
(里面加上了计时代码,可以自己对比所用时间,实际使用去掉)
“最低价:  %%j        %%k.%%l”中间用TAB制表符间隔“%%j”“%%k”

最快速度(仅限LZ提供的文件):
::zh159@bbs.cn-dos.net 2007-1-15
@echo off
title 水产最低价^&最高价  zh159@bbs.cn-dos.net  2007-1-15
setlocal EnableDelayedExpansion
:loop
set time1=%time%
if not "%time1:~-2%" == "00" goto loop
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
del list.txt
echo %time1%
echo %time%
pause
exit

:Scan
set "%1">list.txt
set Min=M
set Max=0
for /f "tokens=1-4* delims==." %%i in (list.txt) 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 (list.txt) do if "%%k%%l" == "%Min%" echo   最低价:  %%j        %%k.%%l
for /f "tokens=1-4* delims==." %%i in (list.txt) do if "%%k%%l" == "%Max%" echo   最高价:  %%j        %%k.%%l
echo.------------------------------
goto :eof
最少变量:
::zh159@bbs.cn-dos.net 2007-1-15
@echo off
title 水产最低价^&最高价  zh159@bbs.cn-dos.net  2007-1-15
setlocal EnableDelayedExpansion
:loop
set time1=%time%
if not "%time1:~-2%" == "00" goto loop
for /f "tokens=1-3*" %%i in (a.txt) do if not "%%j" == "!Type!" set Type=%%j&&call :Scan %%j
del list.txt
echo %time1%
echo %time%
pause
exit

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