Board logo

标题: [文件操作] 批处理怎样把文本内特定数据提取到新的文本? [打印本页]

作者: cgwang    时间: 2014-12-25 16:58     标题: 批处理怎样把文本内特定数据提取到新的文本?

如何将下列数据里Start-Line下面em592、1|Db前后两个数、|dz后数提出到新的文本
For M5|Adr     1|TO  20141220.dat               |                      |                      |                      |
For M5|Adr     2|TO  Start-Line      aBFFB     1|                      |                      |                      |
For M5|Adr     3|KD1    EM592                  1|                      |                      |Z         0.00000 m   |
For M5|Adr    14|KD1        2                  1|Sh        0.07105 m   |dz       -0.07105 m   |Z         0.00000 m   |
For M5|Adr    15|KD2        2        2         1|Db          13.94 m   |Df          14.51 m   |Z         0.07105 m   |
For M5|Adr    16|TO  End-Line                  1|                      |                      |                      |
For M5|Adr     1|TO  20141220.dat               |                      |                      |                      |
For M5|Adr     2|TO  Start-Line      aBFFB     1|                      |                      |                      |
For M5|Adr     3|KD1    EM591                  1|                      |                      |Z         0.00000 m   |
For M5|Adr    44|KD1        8                  1|Sh        0.03500 m   |dz       -0.03500 m   |Z         0.00000 m   |
For M5|Adr    45|KD2        8        8         1|Db         343.70 m   |Df         345.29 m   |Z         0.03500 m   |
For M5|Adr    46|TO  End-Line                  1|                      |                      |                      |
For M5|Adr     1|TO  20141220.dat               |                      |                      |                      |
For M5|Adr     2|TO  Start-Line      aBFFB     1|                      |                      |                      |
For M5|Adr     3|KD1    EM587                  1|                      |                      |Z         0.00000 m   |
For M5|Adr    55|KD2       10       10         1|Db         448.12 m   |Df         448.74 m   |Z        -0.03286 m   |
For M5|Adr    56|TO  End-Line                  1|                      |                      |                      |
提取到新文本,格式为为
EM592   2   13.94  -0.07105
EM591   8   343.70  -0.03500
EM587  10  448.12  -0.03286
第三列取 1|Db和|Df 后数据大的那个
由于我对数据理解错误,第三列应该提取的是|Df 前后两个距离之和,而不是两个的最大值。
作者: terse    时间: 2014-12-25 23:33

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.dat) do (
  3.     set "str=%%i"
  4.     if defined Line (
  5.        for /f %%a in ("!str:*|KD1=!") do set "s1=%%a"
  6.        set "Line="
  7.     )
  8.     if "!str:*|Db =!" neq "!str!" (
  9.        for /f "tokens=1-2" %%a in ("!str:*|KD2 =!") do set "s2=%%b"
  10.        for /f %%a in ("!str:*|Db =!") do set "s3=%%a"
  11.        for /f %%a in ("!str:*|Df =!") do (
  12.            for /f "tokens=1-2 delims=." %%A in ("!s3!") do (
  13.                for /f "tokens=1-2 delims=." %%C in ("%%a") do (
  14.                    if %%A equ %%C (
  15.                       if 1%%B lss 1%%D set "s3=%%a"
  16.                    ) else if %%A lss %%C set "s3=%%a"
  17.                )
  18.            )
  19.        )
  20.        for /f %%a in ("!str:*|Z =!") do set "s4=%%a"
  21.     )
  22.     if defined s4 (
  23.        echo !s1! !s2! !s3! !s4!
  24.        set s4=
  25.     )
  26.     if "!str: Start-Line =!" neq "!str!" set "Line=0"
  27. )
  28. pause
复制代码

作者: ads350668398    时间: 2014-12-26 06:42

本帖最后由 ads350668398 于 2014-12-26 06:48 编辑


怎么我的问题 都很少有人文景  怎么复杂的事情 有人怎么积极#@4

作者: cgwang    时间: 2014-12-26 09:28

提取出来了,可是怎么在dos里面,我想让它提取到一个新的文件里面,该怎么修改呢,大侠
作者: DAIC    时间: 2014-12-26 11:19

回复 4# cgwang
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (a.dat) do (
  3.     set "str=%%i"
  4.     if defined Line (
  5.        for /f %%a in ("!str:*|KD1=!") do set "s1=%%a"
  6.        set "Line="
  7.     )
  8.     if "!str:*|Db =!" neq "!str!" (
  9.        for /f "tokens=1-2" %%a in ("!str:*|KD2 =!") do set "s2=%%b"
  10.        for /f %%a in ("!str:*|Db =!") do set "s3=%%a"
  11.        for /f %%a in ("!str:*|Df =!") do (
  12.            for /f "tokens=1-2 delims=." %%A in ("!s3!") do (
  13.                for /f "tokens=1-2 delims=." %%C in ("%%a") do (
  14.                    if %%A equ %%C (
  15.                       if 1%%B lss 1%%D set "s3=%%a"
  16.                    ) else if %%A lss %%C set "s3=%%a"
  17.                )
  18.            )
  19.        )
  20.        for /f %%a in ("!str:*|Z =!") do set "s4=%%a"
  21.     )
  22.     if defined s4 (
  23.        echo !s1! !s2! !s3! !s4!
  24.        set s4=
  25.     )
  26.     if "!str: Start-Line =!" neq "!str!" set "Line=0"
  27. ))>新的文本.txt
复制代码

作者: DAIC    时间: 2014-12-26 11:20

回复 3# ads350668398


    可以考虑一下是不是自己提问的方式有待改善
作者: cgwang    时间: 2014-12-26 12:49

谢谢 terse 和DAIC的帮助,问题解决了。以后我会注意提问方式的
作者: cgwang    时间: 2014-12-26 13:30

回复 7# cgwang


    由于我对数据理解错误,第三列应该提取的是|Df 前后两个距离之和,而不是两个的最大值,看来文化知识少就是很可怕呀




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