无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4922|回复: 43

如何用批处理查找表格?

[复制链接]
发表于 2022-9-5 12:07:18 | 显示全部楼层 |阅读模式
本帖最后由 bjay2008xmy 于 2022-9-5 12:12 编辑

比如我有一个表是这样的,
a b c d e f g h i j依次对应1 2 3 4 5 6 7 8 9 0

我输入任意长度的一段字母,比如最长为12位。比如bfgj就显示对应的数字2670,输入abcdabcdabcd就显示123412341234


还有一种比较复杂的,根据某行和某列输出字符的。










发表于 2022-9-5 12:10:29 | 显示全部楼层
这是啥表,如果是Excel类的直接用函数可以搞定,数据库地话也有相应的查询命令
回复

使用道具 举报

发表于 2022-9-5 12:10:50 | 显示全部楼层
没弄过。。。
回复

使用道具 举报

发表于 2022-9-5 13:00:36 来自手机 | 显示全部楼层
用 set 和 for

点评

@echo off :a set /p input=请输入: for /f "tokens=1-12 delims= " %%i in ('echo %input%') do ( for %%a in (%%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t) DO ( for %%b in (1 2 3 4 5 6 7 8 9  详情 回复 发表于 2022-9-5 13:41
回复

使用道具 举报

发表于 2022-9-5 13:01:07 | 显示全部楼层
有点像做输入法程序,又像字符映射。用热处理有些复杂。
回复

使用道具 举报

发表于 2022-9-5 13:23:06 | 显示全部楼层
提供个思路,列好对应表,然后输入的字符拆解,hlookup或vlookup,然后再字符合并
回复

使用道具 举报

 楼主| 发表于 2022-9-5 13:28:38 | 显示全部楼层
邪恶海盗 发表于 2022-9-5 12:10
这是啥表,如果是Excel类的直接用函数可以搞定,数据库地话也有相应的查询命令

不是EXCEL和数据库那种表,是我自己手写的表

点评

手写的还要用OCR转换,你确定批处理搞得定???  详情 回复 发表于 2022-9-5 14:10
回复

使用道具 举报

 楼主| 发表于 2022-9-5 13:41:27 | 显示全部楼层

@echo off
:a
set /p input=请输入:
for /f "tokens=1-12 delims= " %%i in ('echo %input%') do (
  for %%a in (%%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t) DO (
    for %%b in (1 2 3 4 5 6 7 8 9 0) do (
      for %%c in (
goto a
pause

我想出了一段,大概是这样
回复

使用道具 举报

发表于 2022-9-5 13:42:47 | 显示全部楼层
批处理不是万能的吧
回复

使用道具 举报

发表于 2022-9-5 14:10:23 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 13:28
不是EXCEL和数据库那种表,是我自己手写的表

手写的还要用OCR转换,你确定批处理搞得定???
回复

使用道具 举报

 楼主| 发表于 2022-9-5 14:19:12 | 显示全部楼层
邪恶海盗 发表于 2022-9-5 14:10
手写的还要用OCR转换,你确定批处理搞得定???

偏题了
回复

使用道具 举报

发表于 2022-9-5 15:30:58 | 显示全部楼层
本帖最后由 slore 于 2022-9-5 16:18 编辑
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION

  2. set key_str=a b c d e f g h i j
  3. set value_str=1 2 3 4 5 6 7 8 9 0
  4. call :CREATE_DICT

  5. set /p input=请输入(a-j):
  6. call :TRANS
  7. echo %trans_input%

  8. pause
  9. goto :EOF


  10. rem =======================================
  11. :TRANS
  12. set trans_input=&set n=0
  13. :NextInputChar
  14. set c=!input:~%n%,1!
  15. if "%c%"=="" goto :EOF
  16. set /a n+=1
  17. set trans_input=%trans_input%!Dict[%c%]!
  18. goto :NextInputChar
  19. goto :EOF


  20. :CREATE_DICT
  21. set /a n=0 & for %%i in (%key_str%) do ( set /a n+=1&&call set KEYS[!n!]=%%i)
  22. set /a n=0 & for %%i in (%value_str%) do (set /a n+=1&&call set Dict[%%KEYS[!n!]%%]=%%i)
  23. goto :EOF
复制代码
回复

使用道具 举报

 楼主| 发表于 2022-9-5 15:51:53 | 显示全部楼层

看起来很复杂,好像用到了数组

点评

批处理能做,就是复杂。 随便换个, vbs, python, ruby, lua 简单的不像话。 不是要求必须用批处理弄的话,建议你看下python吧。 属于降维简化代码。  详情 回复 发表于 2022-9-5 16:20
妥妥的大小写转换程序  详情 回复 发表于 2022-9-5 16:10
回复

使用道具 举报

 楼主| 发表于 2022-9-5 16:10:10 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 15:51
看起来很复杂,好像用到了数组

妥妥的大小写转换程序
回复

使用道具 举报

发表于 2022-9-5 16:20:04 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 15:51
看起来很复杂,好像用到了数组

批处理能做,就是复杂。

随便换个, vbs, python, ruby, lua 简单的不像话。
不是要求必须用批处理弄的话,建议你看下python吧。

属于降维简化代码。
回复

使用道具 举报

发表于 2022-9-5 16:23:23 | 显示全部楼层
另外,如果不用动态创建 “字典”,代码应该更清楚些吧。

  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION

  2. set Dict[a]=1
  3. set Dict[b]=2
  4. set Dict[c]=3
  5. set Dict[d]=4
  6. set Dict[e]=5
  7. set Dict[f]=6
  8. set Dict[g]=7
  9. set Dict[h]=8
  10. set Dict[i]=9
  11. set Dict[j]=0

  12. set /p input=请输入(a-j):
  13. call :TRANS
  14. echo %trans_input%

  15. pause
  16. goto :EOF


  17. rem =======================================
  18. :TRANS
  19. set trans_input=&set n=0
  20. :NextInputChar
  21. set c=!input:~%n%,1!
  22. if "%c%"=="" goto :EOF
  23. set /a n+=1
  24. set trans_input=%trans_input%!Dict[%c%]!
  25. goto :NextInputChar
  26. goto :EOF
复制代码
回复

使用道具 举报

 楼主| 发表于 2022-9-5 16:35:40 | 显示全部楼层
slore 发表于 2022-9-5 16:23
另外,如果不用动态创建 “字典”,代码应该更清楚些吧。

代码运行结果都是正确的,而且修改也很简单。小写转大写、大写转小写、或者其他对照稍微修改就能用。
不过用在:字母作行号,数字作列号这样的表好像不行,查不了
回复

使用道具 举报

发表于 2022-9-5 17:01:03 | 显示全部楼层
你这就是2维表。

Dict[A2]=7
Dict[C,3]=5

按这个套路加维度就行。
回复

使用道具 举报

 楼主| 发表于 2022-9-5 17:21:42 | 显示全部楼层
slore 发表于 2022-9-5 17:01
你这就是2维表。

Dict[A2]=7

这么改法运行就提示ECHO处于关闭状态

点评

要输入行列,查询字典内容,我这个就是个意思。 下面循环输出的地方要变化的。 之前是1个字符一个字符转换, 现在输入A2C3得2个字符一起找, 下面的TRANS也需要对应修改下。 直接用可能找不到匹配。  详情 回复 发表于 2022-9-5 18:15
回复

使用道具 举报

发表于 2022-9-5 18:15:48 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 17:21
这么改法运行就提示ECHO处于关闭状态

要输入行列,查询字典内容,我这个就是个意思。


下面循环输出的地方要变化的。
之前是1个字符一个字符转换,

现在输入A2C3得2个字符一起找,
下面的TRANS也需要对应修改下。
直接用可能找不到匹配。

你最好像1楼一样,把处理要求,和输入例子补充完整。
回复

使用道具 举报

 楼主| 发表于 2022-9-5 19:05:09 | 显示全部楼层
slore 发表于 2022-9-5 18:15
要输入行列,查询字典内容,我这个就是个意思。

表类似坐标系那样,用横坐标和纵坐标定位,内容由自己定义。
样式就像这样,就比如这个20行26列组成的表格
123.png

点评

我感觉这个数组就像变量一样,不用[]也可以,Dict_1=7. Dict_!num!  详情 回复 发表于 2022-9-5 19:11
回复

使用道具 举报

 楼主| 发表于 2022-9-5 19:11:25 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 19:05
表类似坐标系那样,用横坐标和纵坐标定位,内容由自己定义。
样式就像这样,就比如这个20行26列组成的表 ...

我感觉这个数组就像变量一样,不用[]也可以,Dict_1=7.
Dict_!num!

点评

本来就是。写成数组只是好看。 set Dict列出来,方便。  详情 回复 发表于 2022-9-5 19:41
回复

使用道具 举报

发表于 2022-9-5 19:41:24 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 19:11
我感觉这个数组就像变量一样,不用[]也可以,Dict_1=7.
Dict_!num!

本来就是。写成数组只是好看。

set Dict列出来,方便。
回复

使用道具 举报

发表于 2022-9-5 20:28:58 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-9-5 20:33 编辑

如下代码,适用 a-z ,再大的 比如 aa,ab,ac,ad,ae...等两个字母的,需要再复杂一点儿。


dsafdsa.PNG




  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. :loop1

  4. set str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  5. SET N=0
  6. set /p str2=请输入一段英文字母:
  7. if "!str2!"=="" goto :error1
  8. set "str2=!str2: =!"
  9. echo.
  10. echo "!str2!"
  11. set "str3="
  12.     set n1=0
  13.     :loop2
  14.         for %%c in (!n1!) do (
  15.             if "!str2:~%%c,1!"=="" goto :end1
  16.             set found=0
  17.             for /l %%n in (1,1,26) do (
  18.                 if /i  "!str1:~%%n,1!"=="!str2:~%%c,1!" (
  19.                     set "str3=!str3!,%%n"
  20.                     set found=1
  21.                 )
  22.             )
  23.             if !found! equ 0 goto :error2

  24.         )
  25.         set /a n1+=1
  26.    
  27.     goto :loop2
  28.     :end1
  29. echo !str3!
  30. pause
  31. goto :eof

  32. :eorro1
  33. echo 输入错误
  34. pause
  35. goto :loop1

  36. :error2
  37. echo 输入错误,包含非英文字母内容
  38. pause
  39. goto :loop1
复制代码



点评

代码写得还是很好的  详情 回复 发表于 2022-9-5 22:26
回复

使用道具 举报

 楼主| 发表于 2022-9-5 20:56:15 | 显示全部楼层
slore 发表于 2022-9-5 19:41
本来就是。写成数组只是好看。

set Dict列出来,方便。

slore的代码很有特点,就是前面的简单,把具体实现的方法都放在后面了。我只看的懂前面,可以白嫖一个查二维表的样例吗。现在是字母是单位数,数字可能有双位数

123.png

点评

你要怎么输入双位的坐标,还有和一楼的例子, 你输入啥,输出啥。你都没说。后面不知道怎么引用表。  详情 回复 发表于 2022-9-5 22:27
我就试了一句set c=!input:~%n%,2!这就可以了?  详情 回复 发表于 2022-9-5 21:44
回复

使用道具 举报

 楼主| 发表于 2022-9-5 21:44:14 | 显示全部楼层
本帖最后由 bjay2008xmy 于 2022-9-5 21:58 编辑
bjay2008xmy 发表于 2022-9-5 20:56
slore的代码很有特点,就是前面的简单,把具体实现的方法都放在后面了。我只看的懂前面,可以白嫖一个查 ...
回复

使用道具 举报

 楼主| 发表于 2022-9-5 22:26:44 | 显示全部楼层
dos时代菜鸟 发表于 2022-9-5 20:28
如下代码,适用 a-z ,再大的 比如 aa,ab,ac,ad,ae...等两个字母的,需要再复杂一点儿。

代码写得还是很好的
回复

使用道具 举报

发表于 2022-9-5 22:27:35 | 显示全部楼层
bjay2008xmy 发表于 2022-9-5 20:56
slore的代码很有特点,就是前面的简单,把具体实现的方法都放在后面了。我只看的懂前面,可以白嫖一个查 ...

你要怎么输入双位的坐标,还有和一楼的例子,

你输入啥,输出啥。你都没说。后面不知道怎么引用表。
回复

使用道具 举报

发表于 2022-9-5 22:29:27 | 显示全部楼层
  1. # 如果要返回26个英文字母的序号,这个确实很简单,方法之一,我这Python幼儿园的水平也能写出一点
  2. import string
  3. s = input('请输入: ')

  4. x = y = ''
  5. for i in s.upper():
  6.     x += i + '\t'
  7.     y += str(int(string.ascii_uppercase.index(i))+1) + '\t'

  8. print(x)
  9. print(y)
复制代码


回复

使用道具 举报

发表于 2022-9-5 22:50:48 | 显示全部楼层
输入数字,返回字母

  1. import string
  2. t = input('请输入1-26之间的数字,空格分隔:')
  3. a = b = ''

  4. for i in t.split():
  5.     a += i + '\t'
  6.     b += string.ascii_uppercase[int(i)-1] + '\t'
  7. print(a)
  8. print(b)
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-29 10:16

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表