在 [共同参与][挑战思路][批处理:轻松译单词]这个帖子的讨论过程中,我曾提出:借鉴33F的思路,可以做出 公交信息查询器 之类的东西(请看34F的帖子)。
在提出设想的当天,写下了这个脚本的雏形;在此后将近一个月的时间里,诸事缠身,代码一直在断断续续的编写之中。昨天抽空把代码梳理了一下,把初步的代码发在DOS联盟脚本技术群里,收到了联盟里几位热心会员的反馈。今天再次梳理代码,增添了点功能,发出来请各位测试。
(提示:若以下提到的功能在这个脚本中得不到反映,则表明这些功能是后续版本的努力方向;若各位有什么好想法,请跟帖发表建议,3Q)
公交线路.txt复制代码
- @echo off
- title 公交线路信息查询器-test
- setlocal enabledelayedexpansion
- goto begin
- 功能:
- ① 输入线路名称,显示该线路的所有站点及发车收车时间;
- ② 输入上车站点和下车站点,显示可直达的车次,并显示每条线路中这两个站点及其之间的所有站点及发车收车时间;
- ③ 可查询换乘线路
- 流程:
- 1、输入查询对象;
- 2、判断输入类型:若为数字、数字+字母,则查询车次;若带汉字,则查询站点信息;
- 3、若查询车次,有则显示,无则提示重新查询;
- 4、若查询站点,首先检测是否存在此站点;若不存在,则提示换用近似的站点查询;若存在该站点,有直达则只显示直达,无直达则提示查询换乘;若无换乘,则提示重新查
- 询,此时罗列近似的起止站点供选择;
- code by JM 2006-10-17~11-10 CMD@XP
- :begin
- cls
- set input=
- set /p input=请输入车次或上、下车站点:
- :: 车次只允许输入数字或数字+字母,否则会认为是站点
- echo %input%|findstr /r "^[0-9][0-9]*[a-zA-Z]*$">nul &&(
- call :get_line %input%
- echo !num!
- echo !_time!
- echo !line_info:~1,-1!
- goto end
- )
- call :find_station %input%
- rem ========== 查询车次编号匹配的线路信息 ==========
- :get_line
- :: 获取要查询的车次编号所在的行
- cls
- set line=
- for /f "tokens=1* delims=:" %%i in ('findstr /nr "^%1路:$" 公交线路.txt') do (
- set line=%%i
- if not "!line!"=="" goto get_block
- )
- goto no-item
- rem ========== 查询直达方案 ==========
- :find_station
- :: 只允许同时输入两个站点
- if "%2"=="" goto begin
- if not "%3"=="" goto begin
- find "-%1-" 公交线路.txt>nul||goto no-start
- find "-%2-" 公交线路.txt>nul||goto no-end
- cls
- set line=
- set str=
- set var=
- for /f "tokens=1* delims=:" %%i in ('findstr /n "\-%1\-" 公交线路.txt') do (
- set line=%%i
- set str=%%j
- set str=!str:-%2-=!
- if not "!str!"=="%%j" (
- set var=%%j
- set var=!var:-%1-=-☆%1☆-!
- set var=!var:-%2-=-☆%2☆-!
- call :pick-up %input% !var!
- call :type_nostop
- )
- )
- :: 如果没找到直达线路,则查询换乘方案
- if "%var%"=="" call :transfer %input%
- :end
- pause
- goto begin
- rem ========== 查询换乘方案 ==========
- :: 换乘线路只能查到匹配的第一条,可能不是最短线路
- :transfer
- set first_line=
- set first_id=
- set first_time=
- set second_line=
- set second_id=
- set second_time=
- set link=
- for /f "tokens=1* delims=:" %%i in ('findstr /n "\-%1\-" 公交线路.txt') do (
- set first_line=%%i&set str_start=%%j
- set stations_start=!str_start:-= !
- for /f "tokens=1* delims=:" %%k in ('findstr /n "\-%2\-" 公交线路.txt') do (
- set second_line=%%k&set str_end=%%l
- set stations_end=!str_end:-= !
- for %%m in (!stations_start!) do (
- for %%n in (!stations_end!) do (
- if "%%m"=="%%n" (
- set link=%%m
- set /a line=!first_line!-2&&call :get_block
- set first_id=!num!
- set first_time=!_time!
- set /a line=!second_line!-2&&call :get_block
- set second_id=!num!
- set second_time=!_time!
- goto type_change
- )
- )
- )
- )
- )
- if "%link%"=="" goto no-change
- rem ━━━━━━━━━━━ 子过程 ━━━━━━━━━━━
- rem ========== 获取某条线路的完整信息 ==========
- :get_block
- set /a line-=1
- set count=
- for /f "skip=%line%" %%i in (公交线路.txt) do (
- set /a count+=1
- if !count! equ 1 set num=%%i
- if !count! equ 2 set _time=%%i
- if !count! equ 3 set line_info=%%i
- if !count! gtr 3 goto :eof
- )
- rem ========== 提取上车站点到下车站点之间的所有站点 ==========
- :pick-up
- for /f "tokens=2-4 delims=☆" %%i in ("%3") do set var=%%i%%j%%k
- :: 判断输入的起止点在 公交线路.txt 中的先后顺序
- :: 以决定是否逆向显示相关信息
- for /f "tokens=1 delims=-" %%i in ("!var!") do if "%%i"=="%2" call :reverse
- goto :eof
- rem ========== 显示直达方案信息 ==========
- :type_nostop
- set /a line-=2
- call :get_block
- echo 乘坐 %num:~0,-2% 路车(%_time%):%var%
- echo.
- goto :eof
- rem ========== 显示换乘方案信息 ==========
- :type_change
- echo 交汇点是 %link%
- echo.
- set str_start=!str_start:-%1-=-☆%1☆-!
- set str_start=!str_start:-%link%-=-☆%link%☆-!
- echo 先搭乘 %first_id:~0,-2% 路在 %link% 站下车,然后换乘 %second_id:~0,-2% 路即可,换乘方案为:
- echo.
- call :pick-up %1 %link% %str_start%
- echo %first_id:~0,-2%路(%first_time%): %var%
- set str_end=!str_end:-%2-=-☆%2☆-!
- set str_end=!str_end:-%link%-=-☆%link%☆-!
- echo.
- call :pick-up %1 %2 %str_end%
- echo %second_id:~0,-2%路(%second_time%): %var%
- echo _____________________________________________________________
- goto :eof
- rem ========== 逆向显示站点信息 ==========
- :reverse
- set var=%var:-= %
- set str=
- for %%i in (%var%) do set str=%%i-!str!
- set var=%str:~0,-1%
- goto :eof
- rem ━━━━━━━━━━━ 出错信息 ━━━━━━━━━━━
- :no-start
- cls
- echo 没有找到名为 "%1" 的上车站点
- pause
- goto begin
- :no-end
- cls
- echo 没有找到名为 "%2" 的下车站点
- pause
- goto begin
- :no-change
- echo 没有找到直达线路,也找不到只转一次车的换乘方案
- pause
- goto begin
- :no-item
- echo 没有找到车次编号为 "%input%" 的相关信息,请重新查阅.
- pause
- goto begin
可供参考的数据库文本内容可以在这里下载:火车网,感谢 vkill 提供。复制代码
- 线路信息格式为:
- ① 文本正文首行不能为线路信息,可以设为空,或其他内容;
- ② 每条线路第一行为线路编号,格式为"数字+路:"(如11路:)或 数字+字母+路:(如503A路:),必须是中文半角状态下的冒号;第二行为发、收车时间;第三行为经过的站点,每个站点用短横线括起来,(如:-川大-电子科大-);
- ③ 每条线路的信息块之间只能用空行分隔,或者不分隔;
- ④ 除了站点、时间之间用-分隔之外,其他行不能再出现-;
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 1路:
- 6:00-23:00
- -青龙场中心站-昭觉寺横街-洪家坡-驷马桥-高笋桥-解放路一段-梁家巷-好又多府河店-北大街-中西顺城街-盐市口-红照壁-南大街-浆洗街-南郊路-武侯祠-高升桥-高升桥路中段-佳灵路-川藏路高新路口-太平园-八一家具城-
- 2路:
- 5:45-22:30
- -火车北站-荷花池-高笋塘-二环路北四段-二环路东一段北-二环路东一段中-二环路东一段南-麻石桥-二环路东三段中-万年场-双林中横路-双桥子-塔子山-五桂桥-
- 3路:
- 6:15-23:00
- -桦林园-红砖桥-沙河大桥-东光小区-二环路东五段-三官堂-顺江路-九眼桥-牛王庙-水碾河-东风大桥-大慈寺路-总府路东-文化宫-太升路口-青羊二医院-江汉路东-江汉路西-通锦桥-沙湾路-会展中心-西南交大-交大路西-香榭里-九里堤公交总站-
- 城乡3路:
- 6:30-18:30
- -大丰镇-古柏树村五组-古柏树村四组-川建社区-陆家工业区-幸福村-园艺场-王贾村-九里店-八里桥-双水村-双水碾村-荆竹村-川陕路口-昭觉寺-青龙场-省粮校-省政法学院-成绵立交桥-龙潭立交桥-丛树林-十陵客运站-
- 4路:
- 5:50-23:00
- -五桂桥-双桥子-水碾河-东风大桥-大慈寺路-总府路东-总府路-人民西路-东城根上街-羊市街-西大街-西月城街-花牌坊街-西门车站-营门口立交桥-五里村-茶店子-茶店子西-三环路成灌路立交桥南-茶店子公交站-
欢迎光临 批处理之家 (http://bbs.bathome.net/) | Powered by Discuz! 7.2 |