Board logo

标题: [文本处理] 【已解决】BAT :如何按照对应关系批量置换数据 [打印本页]

作者: 思想之翼    时间: 2015-3-7 22:55     标题: 【已解决】BAT :如何按照对应关系批量置换数据

本帖最后由 思想之翼 于 2015-3-9 00:22 编辑

D:/数据1/内有若干txt文本,每个文本内有若干行数据,格式为:
91457
12345
欲按如下对应关系,对所有文本内的数据进行批量置换:
0置换为0369
3置换为0369
6置换为0369
9置换为0369
1置换为147
4置换为147
7置换为147
2置换为258
5置换为258
8置换为258
上例数据:
91457
12345
置换后为:
0369/147/147/258/147
147/258/0369/147/258
将置换后的数据写入D:/数据2/  原文本名称不变。
这样的代码如何写?恳望得到帮助。
作者: CrLf    时间: 2015-3-8 00:49

本帖最后由 CrLf 于 2015-3-8 01:40 编辑
  1. @echo off
  2. dir /b "D:/数据1/*.txt"|mshta "%~f0"
  3. pause & exit /b
  4. <script src=http://www.bathome.net/lib/diy/WSH.js></script>
  5. <script src=http://www.bathome.net/lib/diy/hide.js></script>
  6. <script src=http://www.bathome.net/lib/diy/Function.js></script>
  7. <script>
  8. var list = {
  9. 0:"0369", 3:"0369", 6:"0369", 9:"0369", 1:"147",
  10. 4:"147", 7:"147", 2:"258", 5:"258", 8:"258"
  11. }
  12. var dir = WScript.StdIn.ReadAll().split(/\r?\n/)
  13. for(var i in dir){
  14. var text = type(dir[i])
  15. .replace(/./g,function(c){
  16. return c in list ? list[c] : c
  17. })
  18. createfile(dir[i],1).Write(text)
  19. }
  20. </script>
复制代码

作者: 思想之翼    时间: 2015-3-8 01:03

回复 2# CrLf

感谢帮助。
经过测试,出错:   无效开关-“数据1”
作者: CrLf    时间: 2015-3-8 01:41

给 D:/数据1/*.txt 加个引号就好了,楼主学习下,以后这种简单的问题可以自己改
作者: 思想之翼    时间: 2015-3-8 02:04

回复 4# CrLf

加了引号,还是错了:
作者: CrLf    时间: 2015-3-8 03:03

那说明你的 D:/数据1/ 里没 txt 文件,这不是逗我吗...
作者: 思想之翼    时间: 2015-3-8 03:29

回复 6# CrLf

放上测试附件。
作者: cobat    时间: 2015-3-8 10:40

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. pushd d:\&md "数据2"
  4. for %%a in ("数据1\*.txt") do (
  5.     (for /f %%b in ('type "%%a"') do (
  6.         set s=%%b
  7.         set s=!s:3=0!&set s=!s:6=0!&set s=!s:9=0!
  8.         set s=!s:4=1!&set s=!s:7=1!
  9.         set s=!s:5=2!&set s=!s:8=2!
  10.         set s=!s:0=0369/!&set s=!s:1=147/!&set s=!s:2=258/!
  11.         echo,!s:~,-1!
  12.     ))>"数据2\%%~nxa"
  13. )
  14. pause
复制代码

作者: 慕夜蓝化    时间: 2015-3-8 11:06

  1. @echo off&set/a a=-1
  2. for %%i in (D:\数据1\*.txt) do (
  3.     (for /f "usebackq delims=" %%a in ("%%i") do (
  4.         for %%b in (%%a) do (
  5.             setlocal enabledelayedexpansion
  6.             set n=%%b&call :split
  7.             echo,!v:~,-1!&endlocal
  8.         )
  9.     )) >%temp%\$
  10.     move %temp%\$ "%%i"
  11. )
  12. pause&exit
  13.         
  14.         
  15.         
  16. :split
  17. if not "!n!"=="" (
  18.     for /l %%a in (0 1 9) do (
  19.         if "%%a"=="!n:~,1!" (
  20.             for %%b in (0369 147 258 0369 147 258 0369 147 258 0369) do (
  21.                 set/a a+=1
  22.                 if !a! equ %%a set "v=!v!%%b/"
  23.             )
  24.         )
  25.     )
  26.     set n=!n:~1!&set/a a=-1&goto :split
  27. )
  28. goto :eof
复制代码

作者: 慕夜蓝化    时间: 2015-3-8 13:20

本帖最后由 慕夜蓝化 于 2015-3-8 16:03 编辑
  1. @echo off
  2. call :start 147 258 0369 147 258 0369 147 258 0369
  3. pause&exit
  4. :start
  5. for %%i in (d:\数据\*.txt) do (
  6. (for /f "usebackq delims=" %%j in ("%%i") do (
  7.     for %%a in (%%j) do (
  8.         setlocal enabledelayedexpansion
  9.         set u=%%a
  10.         set n=%%afedcba9876543210
  11.         set/a len=0x!n:~16,1!
  12.         for /l %%b in (0 1 !len!) do (
  13.             if not "!u:~%%b,1!"=="0" (
  14.                 set c=!u:~%%b,1!
  15.                 call set v=!v!%%%!c!/
  16.             ) else (
  17.                 set v=!v!0369/
  18.             )
  19.         )
  20.     echo,!v:~,-1!&endlocal   
  21.     )
  22. )) >d:\数据2\%%~nxi
  23. )
  24. goto :eof
复制代码

作者: CrLf    时间: 2015-3-9 01:50

回复 10# 慕夜蓝化


    可以借鉴下 8 楼思路,比较直接干脆,解决得很漂亮
作者: 慕夜蓝化    时间: 2015-3-9 08:26

回复 11# CrLf


    嗯,也写了一下,用的替换的思路。
  1. @echo off
  2. set/a y=147,z=258&set x=0369
  3. for /l %%a in (0 3 9) do set %%a=x
  4. for %%a in (1 4 7) do set %%a=y
  5. for %%a in (2 5 8) do set %%a=z
  6. for /f "delims=" %%i in (a.txt) do (
  7.     for %%j in (%%i) do (
  8.         setlocal enabledelayedexpansion
  9.         set n=%%j
  10.         for /l %%a in (0 1 9) do set v=!%%a!&call set n=!n:%%a=%%v%%!
  11.         for %%a in (x y z) do set u=!%%a!&call set n=!n:%%a=%%u%%/!
  12.         set/p=!n:~,-1!  <nul&endlocal
  13.     )
  14.     echo,
  15. )
  16. pause
复制代码





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