Board logo

标题: [文本处理] 【已解决】BAT:如何将文本内的四位数据拆分为两位数据 [打印本页]

作者: 思想之翼    时间: 2015-1-10 13:51     标题: 【已解决】BAT:如何将文本内的四位数据拆分为两位数据

本帖最后由 思想之翼 于 2015-1-15 01:58 编辑

D:/数据/内有若干txt文本,每个文本数据格式如下:
0910
0109 0110 0209 0210
0414 0312

现在欲将各文本内的数据拆分为两位数,并排成一行,一行数据末尾加回车键。比如上例的结果如下:
09 10 01 09 01 10 02 09 02 10 04 14 03 12

这样的代码如何写?恳望得到帮助。

或者先将竖排的四位数,转换为横排:
  1. fr -r:"[\r\n]+" -t:" " "D:\数据\*.txt"
复制代码
即:0910 0109 0110 0209 0210 0414 0312
再将各文本内的数据拆分为两位数。卡在如何拆分了,望能得到帮助。
作者: yu2n    时间: 2015-1-10 17:01

本帖最后由 yu2n 于 2015-1-10 23:34 编辑

方法一:使用 Notepad++ 正则替换,供参考:
第一步:替换
查找目标:  (\d{2})(\d{2})(\s*)
替换为:     ($1 $2 )

第二步:加回车
查找目标:  (.*)
替换为:     ($1\r)



方法二:使用 fr.exe 批量替换文本文件
fr 下载地址: http://baiy.cn/utils/fr/index.htm

第一步:替换
  1. fr   -r:"(\d{2})(\d{2})(\s*)"   -t:"\1 \2 "   "D:\数据\*.txt"
复制代码
第二步:加回车
  1. fr   -r:"(.*)"   -t:"\1\r"   "D:\数据\*.txt"
复制代码

作者: 再世情緣    时间: 2015-1-10 22:10

给你个思路吧,先弄成1行,然后把空格替换为空,然后在用set截取
作者: terse    时间: 2015-1-10 23:57

  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     mshta "javascript:var f=new ActiveXObject('Scripting.FileSystemObject');var s=f.GetStandardStream(0).readall();f.GetStandardStream(1).Write(s.replace(/[\r\n\s]/mg,'').replace(/(\d{2}(?=\d))/mg,'$1 '));close()"<"%%i" >$
  4.     move $ "%%i"
  5. )
  6. pause
复制代码

作者: 思想之翼    时间: 2015-1-11 11:08

回复 4# terse

感谢
作者: yu2n    时间: 2015-1-11 12:16

回复 4# terse


terse 发表于 2015-1-10 23:57

个人觉得还是这样用比较好,命令提示符不会失去焦点:
  1. @echo off
  2. :: 生成 fr.js
  3. (echo var f=new ActiveXObject^('Scripting.FileSystemObject'^);
  4. echo var s=f.GetStandardStream^(0^).readall^(^);
  5. echo f.GetStandardStream^(1^).Write^(s.replace^(/[\r\n\s]/mg,''^).replace^(/^(\d{2}^(?=\d^)^)/mg,'$1 '^)^)
  6. )>"%tmp%\fr.js"
  7. :: 替换该目录所有文本,跳过文件大小为0的文本
  8. for /f "delims=" %%A in ('dir /b /a-d *.txt') do (
  9.   if "%%~zA" neq "0" (
  10.     echo %%~A
  11.     cscript //NoLogo  "%tmp%\fr.js"   <   "%%~A"   >   "%tmp%\$"
  12.     move   "%tmp%\$"   "%%~A" >nul 2>nul
  13.   )
  14. )
  15. pause
复制代码

作者: 思想之翼    时间: 2015-1-11 12:24

回复 6# yu2n

感谢
作者: terse    时间: 2015-1-11 20:27

回复 6# yu2n
那就改这样吧
  1. @if(0)==(0) echo off
  2. for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  3.     cscript -nologo -e:javascript %0 <"%%i" >"%temp%\$"
  4.     move "%temp%\$" "%%i" >nul
  5. )
  6. pause&exit
  7. @end
  8. var text = WScript.StdIn.ReadAll().replace(/[\r\n\s]/mg,'').replace(/(\d{2}(?=\d))/mg,'$1 ');
  9. WSH.echo(text);
复制代码

作者: pcl_test    时间: 2015-3-5 10:47

回复 1# 思想之翼
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "D:\数据\"
  4. for %%a in (*.txt) do (
  5. set s=
  6. for /f "delims=" %%b in ('type "%%a"') do (
  7. set r=
  8. for %%c in (%%b) do (
  9. set "t=%%c"
  10. set "1_t=!t:~,2! "
  11. set "2_t=!t:~-2! "
  12. set "t=!1_t!!2_t!"
  13. set "r=!r!!t!"
  14. )
  15. set s=!s!!r!
  16. )
  17. >$ echo,!s:~,-1!
  18. move /y $ "%%a"
  19. )
  20. pause
复制代码

作者: 慕夜蓝化    时间: 2015-3-5 13:23

  1. @echo off
  2. for %%i in (d:\数据\*.txt) do (
  3.     (for /f "usebackq delims=" %%a in ("%%i") do (
  4.         for %%b in (%%a) do (
  5.             setlocal enabledelayedexpansion
  6.             set n=%%b
  7.             for /l %%c in (0 2 2) do (
  8.                 set/p=!n:~%%c,2! <nul
  9.             )
  10.             endlocal
  11.         )
  12.     )
  13.     echo,) >%temp%\$
  14.     move /y %temp%\$ "%%i"
  15. )
  16. pause>nul
复制代码





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