Board logo

标题: [文本处理] 批处理for语句分割字符串当字段数目比较多时如何获取各字段 [打印本页]

作者: ht河豚    时间: 2016-8-4 14:27     标题: 批处理for语句分割字符串当字段数目比较多时如何获取各字段

本帖最后由 pcl_test 于 2016-8-4 16:55 编辑

我现在有一个字符串 假设就是123 456 789
以空格为分隔符 用for提取会有3个tokens分别是"123" "456" "789"
我现在要把这三个数据写到变量里很容易实现 用自带的%%i %%j就ok
如果是tokens数目未知的话 用%%i %%j这样的方法去写就不好实现了
更麻烦的是要是tokens超过52就无法处理了
于是我写了一大堆 处理tokens未知的情况
我是想循环执行 每次执行提取一个tokens
代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. call :a "123 456 789"
  4. echo !str1_1!
  5. echo !str1_2!
  6. echo !str1_3!
  7. pause
  8. :a
  9. set "str1=%~1"&set i1=1
  10. ::==计tokens数==
  11. for /l %%i in (0,1,8191) do (
  12. if "!str1:~%%i,1!"==" " (
  13.   if not "!str1:~%%i,2!"==" " (
  14.    if not "!str1:~%%i,2!"=="  " set /a i1+=1
  15.   )
  16. )
  17. )
  18. ::==计数完成==
  19. echo on
  20. setlocal disabledelayedexpansion
  21. ::==按tokens读入数据==
  22. :tknloop1
  23. set i=1
  24. for /f "tokens=%i% delims= " %%j in ("!str1!") do (
  25.   set str1_!i!=%%j
  26.   pause
  27. )
  28. set /a i+=1
  29. if not !i!==!i1! goto tknloop1
  30. ::==读入数据结束==
  31. goto :eof
复制代码
问题就出在读入数据的地方
那个tokens=%i% 我尝试用!i!替换%i% 还有把循环改成for /l然后用%%a代替
最后结果用%i%的时候因为预处理机制 %i%是不会改变的 但是另外两个都直接闪退了 说
"此时不应有!i! delims= "
坛友们有什么好的解决方法?
作者: codegay    时间: 2016-8-4 15:23

用python来做。
作者: pcl_test    时间: 2016-8-4 16:12

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1 1 100) do set "str=!str!%%a "
  4. for %%a in (%str:~,-1%) do set/an+=1&set "#!n!=%%a"
  5. echo;#34=!#34!
  6. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2