找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 92721|回复: 28

【练习-050】批处理超越for命令tokens极限分割字符串

[复制链接]
发表于 2009-8-12 10:50:13 | 显示全部楼层 |阅读模式
  可能有的新手还不知道在for循环中tokens(列)的极限数是31,
而且将同一行中整整31列内容来分行显示也是极为麻烦的,一般不是用
echo %%a&echo %%b...&echo %%z...的这样形式就是用call :lp+shi
ft移位来完成的。
  那么能不能突破这一tokens极限数?又能不能很方便地将一行内
数十列内容分行显示出来?这就是我们今天提出的问题了。
  已知一超长字串符:d_q 973-c_j 314+y_d 356+i_p 638-u_m 2
04+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_
q 705-r_f 601-m_s 822+q_q 17-w_y 720+s_d 325-d_n 559-l_s 109
+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v
678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-
m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i
733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730,现
在要求将这一字串符以+-符为分隔符分行显示出来,每行的显示形式应
为“字母_字母 数值”,如倒数第四行的内容为x_h 130。
  本题满分10分,视情况加分。
  注:请先将此题留给新人们思考(此贴是用批进行自动排版)。

[ 本帖最后由 batman 于 2009-8-12 11:06 编辑 ]
发表于 2009-8-12 12:18:09 | 显示全部楼层
我想一个替换  一个移位
应该是替换的效率高点吧
发表于 2009-8-12 12:19:49 | 显示全部楼层
咱只擅长C啊..这个用C的思路写出来的...额额..
于是这个是很兀余+很没可读性+很缺乏创意+很浪费资源+最后一个数据不晓得为什么会过几秒再跳出来的新手代码....希望大大们指正咯~
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p f=<t.txt
  3. set num=0
  4. set n=
  5. :loop
  6. if "!f:~%num%,1!"=="" goto init
  7. set /a num=num+1
  8. goto loop
  9. :init
  10. set i=0
  11. :next
  12. if "%i%"=="%num%" echo %f%&pause>nul&exit
  13. if "!f:~%i%,1!"=="+" goto sum
  14. if "!f:~%i%,1!"=="-" goto sum
  15. set /a i=i+1
  16. goto next
  17. :sum
  18. echo !f:~0,%i%!
  19. set /a end=%num%-%i%-1
  20. set /a i=i+1
  21. set f=!f:~%i%,%end%!
  22. set i=0
  23. goto next
复制代码

[ 本帖最后由 Seter 于 2009-8-12 12:27 编辑 ]

评分

参与人数 2PB +13 收起 理由
rat + 8 辛苦了
batman + 5 学c也要懂批哦

查看全部评分

 楼主| 发表于 2009-8-12 12:29:21 | 显示全部楼层

回复 3楼 的帖子

楼上代码最大的问题在于效率上,使用逐字符不是解本题的上上之法。。。
发表于 2009-8-12 12:45:28 | 显示全部楼层
把上面整条字符串复制在text.txt
d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730


  1. @echo off
  2. err>temp.x 2>nul
  3. for /f "tokens=*" %%a in (text.txt) do (set a="%%a")
  4. set a=%a:-=" "%
  5. set a=%a:+=" "%
  6. for %%A in (%a%) do echo %%~A>>temp.x
  7. type temp.x
  8. pause
复制代码

[ 本帖最后由 523066680 于 2009-8-12 12:46 编辑 ]

评分

参与人数 5PB +23 技术 +1 收起 理由
guaiwu + 1 高深的逻辑,见识了。
rat + 8
基拉freedom + 5 好厉害............
batman + 5 引号运用的很巧妙,补全10分
pusofalse + 5

查看全部评分

发表于 2009-8-12 13:34:50 | 显示全部楼层
523066680兄的代码 是假设代码只有一行吧 如是这样那就不要FOR了  直接SET 怎么样 set /pa=<text.txt
发表于 2009-8-12 13:55:02 | 显示全部楼层
哈 被你发现拉~  没办法 ……在探究fsutil文本处理 头脑乱了……

话说pusofalse的分好好拿……
发表于 2009-8-12 17:55:37 | 显示全部楼层
纯路过
  1. sed "s/[+-]/\n/g" a.txt
复制代码
 楼主| 发表于 2009-8-12 19:43:01 | 显示全部楼层

回复 8楼 的帖子

路过的就不加分了,再说你用第三方,与出题的初衷不符。。。
发表于 2009-8-12 19:49:10 | 显示全部楼层
set /pa=<text.txt
只能读取1024字节

而for /f ...
最多可以读取8K字节

针对此题不会有问题,要是讲通用性,还是用for好
发表于 2009-8-12 20:46:58 | 显示全部楼层
netbenton回归平民拉 ~  我也要……

话说 你研究的真仔细。 
发表于 2009-8-12 22:23:08 | 显示全部楼层
谁有我简洁 连for也省了..............
不过爆出一个我想不通的问题 问什么第一个会到最后去呢??
保存那个字符串为1.txt
  1. @echo off
  2. set /p f=<1.txt
  3. set f=%f:-=+%
  4. set f=%f:+=&echo %
  5. set f=echo %f%
  6. %f%
  7. pause
复制代码

评分

参与人数 5PB +38 技术 +2 收起 理由
gavinchou + 1 这个回车符替换的真好!
guaiwu + 1 厉害!从没觉得过set可以这么强大
rat + 18
batman + 10 二十一世纪什么最重要?思路啊!
netbenton + 10 有创意!

查看全部评分

发表于 2009-8-12 23:05:09 | 显示全部楼层
楼上的有创意哦!
在%f%前面加个echo 吧

echo %f%

第一个跑到后面的问题似乎不存在呀!
发表于 2009-8-12 23:59:34 | 显示全部楼层
5L和12L的代码亮点。。。
 楼主| 发表于 2009-8-13 08:45:37 | 显示全部楼层
还有种无限tokens的办法
  1. @echo off
  2. set "str=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730"
  3. :lp
  4. for /f "tokens=1* delims=+-" %%a in ("%str%") do (
  5.      echo %%a
  6.      if "%%b" neq "" set "str=%%b"&goto lp
  7. )
  8. pause>nul
复制代码

评分

参与人数 3PB +48 技术 +1 收起 理由
ht河豚 + 1 学习了
rat + 28 效率是否低了一点
netbenton + 20 好贴

查看全部评分

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:13 , Processed in 0.025015 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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