Board logo

标题: [特效代码] 批处理怎样在字符串中插入字符呢? [打印本页]

作者: xzwcn    时间: 2013-3-30 21:38     标题: 批处理怎样在字符串中插入字符呢?

如字符串:340524

转换为:3,4,0,5,2,4

要怎样写代码呢?
作者: BAT-VBS    时间: 2013-3-30 22:20

  1. echo 340524|gawk -F "" "{for(i=1;i<NF;i++)printf $i\",\";print $i}"
复制代码

作者: xzwcn    时间: 2013-3-30 23:52

'gawk' 不是内部或外部命令,也不是可运行的程序
或批处理文件。


作者: CrLf    时间: 2013-3-31 00:47

楼主给的特例可以这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. for /f %%a in ('cmd /v /u /c "echo ^!test^!"^|more') do set "str=!str!,%%a"
  4. echo !str:~1!
  5. pause
复制代码

作者: CrLf    时间: 2013-3-31 00:53

仍然是根据楼主的特例写的:
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. for /l %%a in (0 1 9) do set "str=!str:%%a=,%%a!"
  4. echo !str:~1!
  5. pause
复制代码

作者: CrLf    时间: 2013-3-31 01:00

常见的通用方案是:
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. for /l %%a in (0 1 4090) do (
  4. if "!test:~%%a!"=="" goto exitFor
  5. set "test=!test:~,%%a!,!test:~%%a!"
  6. )
  7. :exitFor
  8. echo !test!
  9. pause
复制代码

作者: CrLf    时间: 2013-3-31 01:10

以上一个方案为基础的另一个方案,最长支持100字符长度,速度较快:
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. for /l %%a in (9 -1 0) do (
  4.    set 个位=!个位!9876543210
  5.    set 十位=!十位!%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a
  6. )
  7. set 个位=!test!!个位!
  8. set 十位=!test!!十位!
  9. set /a 长度=1!十位:~99,1!!个位:~99,1!-100
  10. for /l %%a in (1 1 !长度!) do set "test=,!test:~-1!!test:~,-1!"
  11. echo !test:~1!
  12. pause
复制代码

作者: CrLf    时间: 2013-3-31 01:14

和上一个方案思路一致,只是通过调用二分回溯函数来计算长度,对付长字符串时具有优势
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. call :strlen test 长度
  4. for /l %%a in (1 1 !长度!) do set "test=,!test:~-1!!test:~,-1!"
  5. echo !test:~1!
  6. pause
  7. :strlen
  8. setlocal enabledelayedexpansion
  9. set "$=!%1!#"
  10. set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ .
  11. set/a len+=%%a&set $=!$:~%%a!
  12. endlocal&If %2. neq . (set/a%2=%len%)else echo %len%
  13. exit/b
复制代码

作者: CrLf    时间: 2013-3-31 01:29

或用简便而强大的 js 正则替换:
  1. @set @n=0;/*&echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. echo !test!|cscript /nologo /e:jscript %0
  4. pause&exit/b*/
  5. WScript.Echo(WScript.StdIn.ReadAll().replace(/(\w)/g,",$1").replace(/^,/,""))
复制代码

作者: CrLf    时间: 2013-3-31 01:31

第三方当然也是可以的
  1. @echo off&setlocal enabledelayedexpansion
  2. set test=340524
  3. echo !test!|sed "s/./,&/g;s/^,//"
  4. pause
复制代码

作者: xzwcn    时间: 2013-3-31 09:48

回复 10# CrLf


    非常感谢!辛苦了!我增加个可以自定义字符串及要插入的字符。。如果可以自定义间隔,那要怎么做呢?还是上面的例子,如:间隔为2,结果:34,05,24
  1. @echo off&setlocal enabledelayedexpansion
  2. :input
  3. cls
  4. set str=
  5. set /p test=请输入字符串:
  6. set /p char=请输入要插入的字符:
  7. for /f %%a in ('cmd /v /u /c "echo ^!test^!"^|more') do set "str=!str!%char%%%a"
  8. echo !str:~1!
  9. set "comd="
  10. set /p "comd=按 X 键再回车退出, 否则按回车后继续运行: "
  11. if /i "%comd%"=="x" (exit) else goto :input
  12. exit
复制代码

作者: a5321    时间: 2020-12-22 17:48

非常感谢  思路很好
作者: a5321    时间: 2020-12-23 11:34

不错啊 谢谢分享




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