标题: [文本处理] 【已解决】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 编辑
- @echo off
- dir /b "D:/数据1/*.txt"|mshta "%~f0"
- pause & exit /b
-
- <script src=http://www.bathome.net/lib/diy/WSH.js></script>
- <script src=http://www.bathome.net/lib/diy/hide.js></script>
- <script src=http://www.bathome.net/lib/diy/Function.js></script>
-
- <script>
- var list = {
- 0:"0369", 3:"0369", 6:"0369", 9:"0369", 1:"147",
- 4:"147", 7:"147", 2:"258", 5:"258", 8:"258"
- }
-
- var dir = WScript.StdIn.ReadAll().split(/\r?\n/)
-
- for(var i in dir){
- var text = type(dir[i])
- .replace(/./g,function(c){
- return c in list ? list[c] : c
- })
- createfile(dir[i],1).Write(text)
- }
- </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
- @echo off
- setlocal enabledelayedexpansion
- pushd d:\&md "数据2"
- for %%a in ("数据1\*.txt") do (
- (for /f %%b in ('type "%%a"') do (
- set s=%%b
- set s=!s:3=0!&set s=!s:6=0!&set s=!s:9=0!
- set s=!s:4=1!&set s=!s:7=1!
- set s=!s:5=2!&set s=!s:8=2!
- set s=!s:0=0369/!&set s=!s:1=147/!&set s=!s:2=258/!
- echo,!s:~,-1!
- ))>"数据2\%%~nxa"
- )
- pause
复制代码
作者: 慕夜蓝化 时间: 2015-3-8 11:06
- @echo off&set/a a=-1
- for %%i in (D:\数据1\*.txt) do (
- (for /f "usebackq delims=" %%a in ("%%i") do (
- for %%b in (%%a) do (
- setlocal enabledelayedexpansion
- set n=%%b&call :split
- echo,!v:~,-1!&endlocal
- )
- )) >%temp%\$
- move %temp%\$ "%%i"
- )
- pause&exit
-
-
-
- :split
- if not "!n!"=="" (
- for /l %%a in (0 1 9) do (
- if "%%a"=="!n:~,1!" (
- for %%b in (0369 147 258 0369 147 258 0369 147 258 0369) do (
- set/a a+=1
- if !a! equ %%a set "v=!v!%%b/"
- )
- )
- )
- set n=!n:~1!&set/a a=-1&goto :split
- )
- goto :eof
复制代码
作者: 慕夜蓝化 时间: 2015-3-8 13:20
本帖最后由 慕夜蓝化 于 2015-3-8 16:03 编辑
- @echo off
- call :start 147 258 0369 147 258 0369 147 258 0369
- pause&exit
- :start
- for %%i in (d:\数据\*.txt) do (
- (for /f "usebackq delims=" %%j in ("%%i") do (
- for %%a in (%%j) do (
- setlocal enabledelayedexpansion
- set u=%%a
- set n=%%afedcba9876543210
- set/a len=0x!n:~16,1!
- for /l %%b in (0 1 !len!) do (
- if not "!u:~%%b,1!"=="0" (
- set c=!u:~%%b,1!
- call set v=!v!%%%!c!/
- ) else (
- set v=!v!0369/
- )
- )
- echo,!v:~,-1!&endlocal
- )
- )) >d:\数据2\%%~nxi
- )
- goto :eof
复制代码
作者: CrLf 时间: 2015-3-9 01:50
回复 10# 慕夜蓝化
可以借鉴下 8 楼思路,比较直接干脆,解决得很漂亮
作者: 慕夜蓝化 时间: 2015-3-9 08:26
回复 11# CrLf
嗯,也写了一下,用的替换的思路。- @echo off
- set/a y=147,z=258&set x=0369
- for /l %%a in (0 3 9) do set %%a=x
- for %%a in (1 4 7) do set %%a=y
- for %%a in (2 5 8) do set %%a=z
- for /f "delims=" %%i in (a.txt) do (
- for %%j in (%%i) do (
- setlocal enabledelayedexpansion
- set n=%%j
- for /l %%a in (0 1 9) do set v=!%%a!&call set n=!n:%%a=%%v%%!
- for %%a in (x y z) do set u=!%%a!&call set n=!n:%%a=%%u%%/!
- set/p=!n:~,-1! <nul&endlocal
- )
- echo,
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |