无忧启动论坛

标题: 如何用批处理查找表格? [打印本页]

作者: bjay2008xmy    时间: 2022-9-5 12:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 邪恶海盗    时间: 2022-9-5 12:10
这是啥表,如果是Excel类的直接用函数可以搞定,数据库地话也有相应的查询命令
作者: a349683510    时间: 2022-9-5 12:10
没弄过。。。
作者: dos时代菜鸟    时间: 2022-9-5 13:00
用 set 和 for
作者: 旁观者清    时间: 2022-9-5 13:01
有点像做输入法程序,又像字符映射。用热处理有些复杂。
作者: mfj2002    时间: 2022-9-5 13:23
提供个思路,列好对应表,然后输入的字符拆解,hlookup或vlookup,然后再字符合并
作者: bjay2008xmy    时间: 2022-9-5 13:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 13:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: ldg_2    时间: 2022-9-5 13:42
批处理不是万能的吧
作者: 邪恶海盗    时间: 2022-9-5 14:10
bjay2008xmy 发表于 2022-9-5 13:28
不是EXCEL和数据库那种表,是我自己手写的表

手写的还要用OCR转换,你确定批处理搞得定???
作者: bjay2008xmy    时间: 2022-9-5 14:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 15:30
本帖最后由 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
复制代码

作者: bjay2008xmy    时间: 2022-9-5 15:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 16:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 16:20
bjay2008xmy 发表于 2022-9-5 15:51
看起来很复杂,好像用到了数组

批处理能做,就是复杂。

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

属于降维简化代码。
作者: slore    时间: 2022-9-5 16: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
复制代码

作者: bjay2008xmy    时间: 2022-9-5 16:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 17:01
你这就是2维表。

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

按这个套路加维度就行。
作者: bjay2008xmy    时间: 2022-9-5 17:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 18:15
bjay2008xmy 发表于 2022-9-5 17:21
这么改法运行就提示ECHO处于关闭状态

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


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

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

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

作者: bjay2008xmy    时间: 2022-9-5 19:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 19:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 19:41
bjay2008xmy 发表于 2022-9-5 19:11
我感觉这个数组就像变量一样,不用[]也可以,Dict_1=7.
Dict_!num!

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

set Dict列出来,方便。
作者: dos时代菜鸟    时间: 2022-9-5 20:28
本帖最后由 dos时代菜鸟 于 2022-9-5 20:33 编辑

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







  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
复制代码




作者: bjay2008xmy    时间: 2022-9-5 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 21:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 22:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-5 22:27
bjay2008xmy 发表于 2022-9-5 20:56
slore的代码很有特点,就是前面的简单,把具体实现的方法都放在后面了。我只看的懂前面,可以白嫖一个查 ...

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

你输入啥,输出啥。你都没说。后面不知道怎么引用表。
作者: nttwqz    时间: 2022-9-5 22:29
  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)
复制代码



作者: nttwqz    时间: 2022-9-5 22:50
输入数字,返回字母

  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)
复制代码

作者: bjay2008xmy    时间: 2022-9-5 22:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjay2008xmy    时间: 2022-9-5 23:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2022-9-6 06:38
为啥不用 excel vba
作者: bjay2008xmy    时间: 2022-9-6 10:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-6 11:23
本帖最后由 slore 于 2022-9-6 11:34 编辑
bjay2008xmy 发表于 2022-9-5 23:05
一般表中存放的无非就是英文字母、标点符号、汉字之类的。就像秘密通讯的密码本一样
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION

  2.                       set COL=a b c d e f g
  3. set N=1
  4. call :MAKE_COL &&set ROW[1]=m b k q r f z
  5. call :MAKE_DICT&&set ROW[2]=7 8 5 q r f j
  6. call :MAKE_DICT&&set ROW[3]=m b k q 2 f :
  7. call :MAKE_DICT&&set ROW[%N%]=Q b 3 q r f @
  8. call :MAKE_DICT&&set ROW[%N%]=m b k q 1 f j
  9. call :MAKE_DICT
  10. rem set DICT

  11. set /p input=请输入序列组(例如:5a 3j 7a):
  12. call :TRANS %input%
  13. echo %trans_input%

  14. pause
  15. goto :EOF


  16. rem =======================================
  17. :TRANS
  18. set trans_input=&set n=0
  19. :NextInputPair
  20. if "%1"=="" goto :EOF
  21. set trans_input=%trans_input%!Dict[%1]!
  22. shift
  23. goto :NextInputPair
  24. goto :EOF


  25. :MAKE_COL
  26. set k=0
  27. for %%i in (%COL%) do (
  28.     set /a k+=1
  29.     set COL[!k!]=%%i
  30. )
  31. set /a N+=1
  32. goto :EOF

  33. :MAKE_DICT
  34. set /a L=%N%-1
  35. echo !ROW[%L%]!
  36. set k=0
  37. for %%i in (!ROW[%L%]!) do (
  38.     set /a k+=1
  39.     call set cn=%%COL[!k!]%%
  40.     set DICT[%L%!cn!]=%%i
  41. )
  42. set /a N+=1
  43. goto :EOF
复制代码



简单的,数字,字母,汉字都OK。
但是批处理的字符串处理有很多限制。 比如:【*】的话,
作为密码对应字符就会得到文件名,非要用的话,可以先用【星】,然后转换后的结果,
再把【星】替换掉。
作者: slore    时间: 2022-9-6 11:41
和之前一样,自己写死字典,不需要自动生成,只要TRANS标签函数即可。

  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION

  2. set Dict[1a]=m
  3. set Dict[1b]=3
  4. set Dict[1c]=Q

  5. set Dict[2a]=mA
  6. set Dict[2b]=:
  7. set Dict[2c]=V

  8. set Dict[15aa]=xyz
  9. set Dict[15bb]=abc
  10. set Dict[15cc]=qwe

  11. set /p input=请输入序列组(例如:1a 2c 1b 2a 2b 15aa):
  12. call :TRANS %input%
  13. echo %trans_input%

  14. pause
  15. goto :EOF


  16. rem =======================================
  17. :TRANS
  18. set trans_input=&set n=0
  19. :NextInputPair
  20. if "%1"=="" goto :EOF
  21. set trans_input=%trans_input%!Dict[%1]!
  22. shift
  23. goto :NextInputPair
  24. goto :EOF
复制代码

作者: bjay2008xmy    时间: 2022-9-6 16:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: dos时代菜鸟    时间: 2022-9-7 08:54
本帖最后由 dos时代菜鸟 于 2022-9-7 09:00 编辑

用 for + set + if ,搞定。其实 逻辑很简单。





  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION

  3. set str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  4. set strx=
  5. set /p str2=请输入一组excel单元格坐标,用逗号相隔,如(1a,2b,3c,4d...):
  6. for %%a in (!str2!) do (
  7.     set str0=
  8.     for /f "tokens=1 delims=1234567890" %%d in ("%%a") do (
  9.         set str0=%%a
  10.         set str0=!str0:%%d=!
  11.         call :str3x "!str0!" "%%d"
  12.     )
  13. )
  14. echo !strx!
  15. pause
  16. goto :eof

  17. :str3x
  18.     set "str3=%~2"
  19.     set x2=
  20.     set x1=
  21.     set L1=!str3:~0,1!
  22.     set L2=!str3:~1,1!
  23.     for /l %%f in (1,1,26) do (
  24.         if /i "!L1!"=="!str1:~%%f,1!" set x1=%%f
  25.         if /i "!L2!"=="!str1:~%%f,1!" set x2=%%f
  26.     )
  27.     if "!x2!"=="" (
  28.         set x=!x1!
  29.     ) else (
  30.         set /a x=!x1!*26+!x2!
  31.     )
  32.     set strx=!strx! (%~1,!x!)
  33.     exit /b
复制代码




作者: slore    时间: 2022-9-7 11:06
dos时代菜鸟 发表于 2022-9-7 08:54
用 for + set + if ,搞定。其实 逻辑很简单。

楼主的是密码字典,行列号对应的值和 本身 行,列 无关。

你这个是把字母转换。   比如 8b = q
作者: bjay2008xmy    时间: 2022-9-7 21:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: slore    时间: 2022-9-8 10:12
bjay2008xmy 发表于 2022-9-7 21:01
我这样改你的程序,不知道改得对不对

@echo off&SETLOCAL ENABLEDELAYEDEXPANSION

对是对的,不过 :a 标签在最开始,每次都重新生成 字典,没有必要。

放到 set /p 输入的地方循环就行了。

  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION


  2.                                              set COL=a b c d e f g h i j k l m n o p q r s t u v w x y z
  3. echo %COL%
  4. echo.
  5. set N=1
  6. call :MAKE_COL &&set ROW[%N%]=A U P Q M I M O N H N W B Z V T F L V X U Z G D U O
  7. call :MAKE_DICT&&set ROW[%N%]=T C C Z Q N X F K Q O P F S B B F K I G M Q R M N W
  8. call :MAKE_DICT&&set ROW[%N%]=X O W X O K G Z A R H Q I A S Q H E T Y H W S I M L
  9. call :MAKE_DICT&&set ROW[%N%]=Y Z Q P G W I F C M D O X T S U J U K E F J X U W D
  10. call :MAKE_DICT&&set ROW[%N%]=B R B I T M S B T C D X X P M D Z Q X T P N J G W K
  11. call :MAKE_DICT&&set ROW[%N%]=K M S T H S W A V D V G Q O R L R X D J W U R C F M
  12. call :MAKE_DICT&&set ROW[%N%]=D L K U F M W O Y K O V I D P A Z A S U F Y D T X S
  13. call :MAKE_DICT&&set ROW[%N%]=B W M E K U B V C S D T K H E C D A X K Y U V Z I C
  14. call :MAKE_DICT&&set ROW[%N%]=X I M M J K B Y M I R E P N M N J P X J W U Y I T O
  15. call :MAKE_DICT&&set ROW[%N%]=O C W Y I T K R S N R B D X Q D E N N D F E N B Q V
  16. call :MAKE_DICT&&set ROW[%N%]=N B W F O G M Z V I W P I C T J K B S W L R M D K F
  17. call :MAKE_DICT&&set ROW[%N%]=I I W R Q U F S V J O Z Y X C H Z U L U X P L T M S
  18. call :MAKE_DICT&&set ROW[%N%]=N T E L A H L N Q V Y K R I F G K V Y E N S H O V B
  19. call :MAKE_DICT&&set ROW[%N%]=Z C Z A Y I X U F J P V V U P E D L D T J Z A L V L
  20. call :MAKE_DICT&&set ROW[%N%]=T T Y B Z P Q T Q B C N J N O N L T G H M G X H I W
  21. call :MAKE_DICT&&set ROW[%N%]=W Q R C A D A A B Q O W B F K M D S P Q H W W I K R
  22. call :MAKE_DICT&&set ROW[%N%]=G N A T R D F L N B Z E E Q C B M R X A G E Z K J P
  23. call :MAKE_DICT&&set ROW[%N%]=I S Z L Z T H S Z O B N H J X V G F W F S L P S I J
  24. call :MAKE_DICT&&set ROW[%N%]=R Z I W R B K K Z V C T T F C V K Z W Q J X R H U P
  25. call :MAKE_DICT&&set ROW[%N%]=A X E O P G M R R T S U G N C A U P Y Z E S O E O D
  26. call :MAKE_DICT
  27. rem set DICT

  28. :a
  29. set /p input=请输入序列组(例如:5a 3j 7a):
  30. call :TRANS %input%
  31. echo 结果:%trans_input%
  32. goto a
  33. pause
  34. goto :EOF


  35. rem =======================================
  36. :TRANS
  37. set trans_input=&set n=0
  38. :NextInputPair
  39. if "%1"=="" goto :EOF
  40. set trans_input=%trans_input%!Dict[%1]!
  41. shift
  42. goto :NextInputPair
  43. goto :EOF


  44. :MAKE_COL
  45. set k=0
  46. for %%i in (%COL%) do (
  47. set /a k+=1
  48. set COL[!k!]=%%i
  49. )
  50. set /a N+=1
  51. goto :EOF

  52. :MAKE_DICT
  53. set /a L=%N%-1
  54. echo !ROW[%L%]!
  55. set k=0
  56. for %%i in (!ROW[%L%]!) do (
  57. set /a k+=1
  58. call set cn=%%COL[!k!]%%
  59. set DICT[%L%!cn!]=%%i
  60. )
  61. set /a N+=1
  62. goto :EOF
复制代码

作者: szwp    时间: 2022-9-12 18:43
setx

/a <X>,<Y>        指定绝对坐标,偏移量作为搜索参数。
/r <X>,<Y> <String>        指定相对坐标和作为搜索参数的 字符串 的偏移量。
作者: bjay2008xmy    时间: 2022-9-12 20:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: hsis872    时间: 2023-5-25 21:23
一个 数组就能解决的事非得用批处理,这不是为难它么




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3