[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何按字编码做成快速查找字典?

本帖最后由 lfoqtal 于 2011-8-1 08:05 编辑

我想将文本中的每个字都加以编号,可以快速查找字的编码或按编码返回相应的字
初编了以下程序,也就是一个小字典。
但发现如果将《千字文》这类很大的文本放入就会出现很多函数,
函数过多会不会影响速度?
有没有更便捷耗内存少的方案?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set 原文=0123456789abcdefghijklmnopqrstuvwxyz
  4. for /l %%a in (0 1 35) do set  _!原文:~%%a,1!=%%a
  5. set /p p=请输入文字:
  6. echo (%p%)的对应代码为!_%p%!
  7. pause
  8. set /p p=请输入代码:
  9. for /f "tokens=1 delims=_=" %%a in ('set _ ^|findstr "=%p%$"') do echo %p%代码对应文字为%%a
  10. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
通用简洁实用就是批处理精神

本帖最后由 lfoqtal 于 2011-7-30 17:01 编辑

回复 2# else


    一个变量,用偏移的方法取位还是很好用的,但如何知道某一字符在这一变量中的位置呢?如果用IF的方式一个个对不是效率很低
通用简洁实用就是批处理精神

TOP

本帖最后由 tmplinshi 于 2011-7-30 18:03 编辑

1.txt:
0123456789abcdefghijklmnopqrstuvwxyz


生成 2.txt:
  1. sed "s/./&\r\n/g" 1.txt | findstr /n . >2.txt
复制代码
2.txt:
1:0
2:1
3:2
4:3
5:4
6:5
7:6
8:7
9:8
10:9
11:a
...


然后直接找:
  1. rem 查找字符 a 的位置
  2. findstr ":a$" 2.txt | sed "s/:.//"
复制代码
  1. rem 查找位置为 11 对应的字符
  2. findstr "^11:" 2.txt | sed "s/^[0-9]\+://"
复制代码
1

评分人数

TOP

回复 4# tmplinshi


生成临时文件倒是一个好办法,
但我想用来做密码的译码本就最好不要生成临时文件,
还有什么方法吗?
通用简洁实用就是批处理精神

TOP

本帖最后由 tmplinshi 于 2011-7-31 16:55 编辑

回复 5# lfoqtal
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set 原文=0123456789abcdefghijklmnopqrstuvwxyz
  4. set /p s=请输入文字:
  5. conset /a p = find("%s%","%原文%") + 1
  6. echo (%s%)的对应代码为 %p%
  7. pause
  8. set /p p=请输入代码:
  9. set /a pp = p - 1
  10. echo %p%代码对应文字为 !原文:~%pp%,1!
  11. pause
复制代码
conset 下载地址:
http://bathome.net/thread-12865-1-3.html

补充:conset 不能查找中文字符的位置。

TOP

已按要求修改,000~999,自动识别代码或字符

本帖最后由 mxxcgzxxx 于 2011-8-2 22:41 编辑

试试这个只用了两个大函数,一个原代码%mm%,一个转换代码%密钥%,
%n%为原代码长度,测试代码为千字文,1000个字,有个别重复,测试通过
注意代码中的空行和空格不要删!
  1. @ECHO OFF
  2. setlocal enabledelayedexpansion
  3. set MM=天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰馀成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩一体率宾归王鸣凤在竹白驹食场化被草木赖及万方盖此身发四大五常恭惟鞠养岂敢毁伤女慕贞洁男效才良知过必改得能莫忘罔谈彼短靡恃己长信使可复器欲难量墨悲丝染诗赞羔羊景行维贤克念作圣德建名立形端表正空谷传声虚堂习听祸因恶积福缘善庆尺璧非宝寸阴是竞资父事君曰严与敬孝当竭力忠则尽命临深履薄夙兴温凊似兰斯馨如松之盛川流不息渊澄取映容止若思言辞安定笃初诚美慎终宜令荣业所基籍甚无竟学优登仕摄职从政存以甘棠去而益咏乐殊贵贱礼别尊卑上和下睦夫唱妇随外受傅训入奉母仪诸姑伯叔犹子比儿孔怀兄弟同气连枝交友投分切磨箴规仁慈隐恻造次弗离节义廉退颠沛匪亏性静情逸心动神疲守真志满逐物意移坚持雅操好爵自縻都邑华夏东西二京背邙面洛浮渭据泾宫殿盘郁楼观飞惊图写禽兽画彩仙灵丙舍傍启甲帐对楹肆筵设席鼓瑟吹笙升阶纳陛弁转疑星右通广内左达承明既集坟典亦聚群英杜稿钟隶漆书壁经府罗将相路侠槐卿户封八县家给千兵高冠陪辇驱毂振缨世禄侈富车驾肥轻策功茂实勒碑刻铭磻溪伊尹佐时阿衡奄宅曲阜微旦孰营桓公匡合济弱扶倾绮回汉惠说感武丁俊乂密勿多士寔宁晋楚更霸赵魏困横假途灭虢践土会盟何遵约法韩弊烦刑起翦颇牧用军最精宣威沙漠驰誉丹青九州禹迹百郡秦并岳宗泰岱禅主云亭雁门紫塞鸡田赤城昆池碣石巨野洞庭旷远绵邈岩岫杳冥治本于农务资稼穑俶载南亩我艺黍稷税熟贡新劝赏黜陟孟轲敦素史鱼秉直庶几中庸劳谦谨敕聆音察理鉴貌辨色贻厥嘉猷勉其祗植省躬讥诫宠增抗极殆辱近耻林皋幸即两疏见机解组谁逼索居闲处沉默寂寥求古寻论散虑逍遥欣奏累遣戚谢欢招渠荷的历园莽抽条枇杷晚翠梧桐蚤凋陈根委翳落叶飘摇游鹍独运凌摩绛霄耽读玩市寓目囊箱易輶攸畏属耳垣墙具膳餐饭适口充肠饱饫烹宰饥厌糟糠亲戚故旧老少异粮妾御绩纺侍巾帷房纨扇圆絜银烛炜煌昼眠夕寐蓝笋象床弦歌酒宴接杯举觞矫手顿足悦豫且康嫡后嗣续祭祀烝尝稽颡再拜悚惧恐惶笺牒简要顾答审详骸垢想浴执热愿凉驴骡犊特骇跃超骧诛斩贼盗捕获叛亡布射僚丸嵇琴阮啸恬笔伦纸钧巧任钓释纷利俗竝皆佳妙毛施淑姿工颦妍笑年矢每催曦晖朗曜璇玑悬斡晦魄环照指薪修祜永绥吉劭矩步引领俯仰廊庙束带矜庄徘徊瞻眺孤陋寡闻愚蒙等诮谓语助者焉哉乎也
  4. set n=999
  5. set "menu1=对应代码为:"
  6. set "menu2=对应字符为:"
  7. set en=^
  8. for /l %%a in (0,1,%n%) do (
  9.             set /a a=1000+%%a   
  10.             set "密钥=!密钥!!en! !a:~-3! !mm:~%%a,1! "
  11.             )
  12. :1
  13. echo.!en!!en!!en!
  14. set /p p=输入需查找的文字或代码:
  15. echo %p%| findstr "^[0-9]*$" >nul && (set "a=2" & set/a p+=1000 & set su=!p:~-3!) || set "a=1" &&set su=%p%
  16. for /f "tokens=%a%" %%a in ('set 密钥 ^|findstr /c:" %su% " ^|^| echo 无此代码;无此字符') do echo.!en!![%su%]!menu%a%![%%a]!en!
  17. pause>nul
  18. goto :1
复制代码
1

评分人数

世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

想帮你加分来着没办法了,24小时后帮你加上去

本帖最后由 lfoqtal 于 2011-7-31 16:49 编辑

回复 6# tmplinshi

谢谢!
通用简洁实用就是批处理精神

TOP

测试发现,conset /a p = find("%s%","%原文%") + 1 不能查找中文字符的位置。

TOP

本帖最后由 lfoqtal 于 2011-7-31 17:01 编辑

回复 10# tmplinshi


    是啊不能用中文,而且输入不存在的号或字就会出乱子

8楼的可以用,但1000号有错,n=999就OK了,非常感谢,
但如果把
  1. set 密钥 |findstr /c:" %p% " ||echo 无此字符;无此代码
复制代码
的值放入FOR中要怎么做能生效呢?
通用简洁实用就是批处理精神

TOP

本帖最后由 lfoqtal 于 2011-7-31 17:37 编辑
  1. for /f "tokens=1,2" %%a in ('set 密钥 ^|findstr /c:" %p% " ^|^|echo 无此代码;无此字符') do echo 代码:%%a  字符:%%b
复制代码
搞定了原来是这样,试了好几次

弱弱的要求下,如果能用000~999做代码就更理想了!
通用简洁实用就是批处理精神

TOP

本帖最后由 mxxcgzxxx 于 2011-7-31 22:49 编辑

8楼按你的要求更新了,但要提醒你,000是最大限度了。到0000就受不了了
[换行]+[空格]+000+[空格]+字符+[空格]=8个字符
8*1000=8000 已经接近最大限度了再多一位就到9000了就只能容下908个代码了,得不偿失
当然也可以不用空格分格可以再多两位数,程序就要再多几句fidnstr来识别就是了,但怎么样也都到不了1200,所以也没太大意义
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

回复 13# mxxcgzxxx


    很好很强大也,基本能看懂,我自己改吧!
通用简洁实用就是批处理精神

TOP

返回列表