Board logo

标题: [文本处理] [已解决]批处理命令FOR如何取TXT文本指定的数值赋予多个变量? [打印本页]

作者: lateol    时间: 2013-7-5 11:28     标题: [已解决]批处理命令FOR如何取TXT文本指定的数值赋予多个变量?

本帖最后由 lateol 于 2013-7-5 19:48 编辑

如我用以下代码获取一些文本的内容
  1. @echo off
  2. for /f "tokens=* delims=PG" %%l in ('findstr /ic:"G54.1P" *.nc') do (
  3.        echo %%l>>1.txt
  4. )
  5. pause
复制代码
得到
如要截取红色部分分别赋值 %%l  %%m   并写入 1.txt
写入后如下
5  002H12-R1.NC
5  002H12-R2.NC

我是想通过P后面的值 作为排序,当全部写入1.txt后  再按前面的这个值排序。
但是感觉定点提取又不太行的通如蓝色部分就不一样。看看还有没有什么好的方法。

002H12-F1.NC:G00 G90 G54.1P6 X0 Y0
002H12-F2.NC:G00 G90 G54.1P6 X0 Y0
002H12-F3.NC:G00 G90 G54.1P6 X0 Y0
002H12-R1.NC:G00 G90 G54.1P5 X0 Y0
002H12-R2.NC:G00 G90 G54.1P5 X0 Y0
002H12-R3.NC:G00 G90 G54.1P5 X0 Y0
13124A1A.nc:G90G54.1P3G00X0.Y0.

13124A1AA.nc:G90G54.1P4G00X0.Y0.
13124A1B.nc:G90G54.1P3G00X0.Y0.
13124A1BB.nc:G90G54.1P4G00X0.Y0.
13124A1C.nc:G90G54.1P3G00X0.Y0.
13124A1CC.nc:G90G54.1P4G00X0.Y0.
13124A1D.nc:G90G54.1P3G00X0.Y0.
13124A1DD.nc:G90G54.1P4G00X0.Y0.
13124A1E.nc:G90G54.1P3G00X0.Y0.
13124A1EE.nc:G90G54.1P4G00X0.Y0.
13124A1F.nc:G90G54.1P3G00X0.Y0.
13124A1FF.nc:G90G54.1P4G00X0.Y0.
13124A3A.nc:G90G54.1P2G00X0.Y0.
13124A3B.nc:G90G54.1P2G00X0.Y0.
13124A3C.nc:G90G54.1P2G00X0.Y0.
13124A3D.nc:G90G54.1P2G00X0.Y0.
13124A3E.nc:G90G54.1P2G00X0.Y0.
R126B17-1.nc:G90G54.1P1G00X0.Y0.
R126B17-2.nc:G90G54.1P1G00X0.Y0.
R126B17-3.nc:G90G54.1P1G00X0.Y0.
R126B17-4.nc:G90G54.1P1G00X0.Y0.
R126B17-5.nc:G90G54.1P1G00X0.Y0.

文本样本   附件:
http://pan.baidu.com/share/link? ... 44&uk=774360720
G54.1P"XX"  有时有多个并存,数值在 1~99
如果有多个并存 取开头就行。
作者: terse    时间: 2013-7-5 13:02

不能理解你的描述
最好给出一点源文本的样本 (也就是 含 G54.1P 的文本)
需要知道的是 G54.1P 在单行中是唯一的还是有多个并存
帮你的人了解越多 才能绕尽量少的弯
作者: lateol    时间: 2013-7-5 13:13

回复 2# terse


    好的 谢谢提醒,附件已经上传。还有G5.1PXX 是有共存的 。
作者: terse    时间: 2013-7-5 13:14

本帖最后由 terse 于 2013-7-5 13:20 编辑

这样吗?
  1. @echo off&setlocal enabledelayedexpansion
  2. %1 %0 : |sort&pause&exit
  3. for /f "tokens=1* delims=:" %%i in ('findstr /ic:G54.1P *.nc') do (
  4.     set "str=%%j"
  5.     set str=!str:*G54.1P=!
  6.     echo !str:~,1! %%i
  7. )
复制代码
发出代码 才看到你的回复说 G5.1P 在一行里面有共存 上面代码不处理这样形式
另排序是按G5.1P 后一位排的
作者: lateol    时间: 2013-7-5 13:20

本帖最后由 lateol 于 2013-7-5 13:24 编辑

回复 4# terse


    是这样 ,不过 如果是G54.1P10  也会变成1?
作者: terse    时间: 2013-7-5 13:24

本帖最后由 terse 于 2013-7-5 13:27 编辑

回复 5# lateol
主要不能确定 G54.1P后面有点有空格  有的没有
有空格的话 是否就取后面一列
没有空格的话 能确定后面是字符是固定G吗 还是有别的情况 这些都是要说明的
上面的代码要针对你的情况 做修正 你的情况越详细才会尽量的把代码完善一些
作者: lateol    时间: 2013-7-5 13:28

回复 6# terse


    常见固定 如
G54.1PXXG00X0Y0
G54.1PXX X0 Y0
G54.1PXX G00 X0. Y0.
作者: terse    时间: 2013-7-5 13:33

回复 7# lateol
仅针对你的资料
  1. @echo off&setlocal enabledelayedexpansion
  2. %1 (for /f "tokens=*" %%i in ('%0 : ^|sort') do echo %%i)&pause&exit
  3. for /f "tokens=1* delims=:" %%i in ('findstr /ic:G54.1P *.nc') do (
  4.     set "str=%%j"
  5.     set str=!str:*G54.1P=!
  6.     for /f "delims=G " %%j in ("!str!") do set "str=     %%j"
  7.     echo !str:~-5! %%i
  8. )
  9.    
复制代码

作者: lateol    时间: 2013-7-5 13:40

回复 8# terse


    完美! 这个语句是什么?%1 (for /f "tokens=*" %%i in ('%0 : ^|sort') do echo %%i)&pause&exit
还有前面的%1  有何意义,set "str=     %%j"  中间要留空吗?
还有在处理下了 怎么做到排序的?再麻烦详解一下谢谢。
作者: terse    时间: 2013-7-5 13:48

回复 9# lateol
%1 (......) 这里是第一次运行行 %0 后面因为有 :  所以相当于注释
空格 不能少 否则影响排序
倒序 在SORT 后加 /R
作者: lateol    时间: 2013-7-5 14:34

回复 10# terse
  1. @echo off
  2. cls
  3. for /l %%i in (1,1,3) do echo.
  4. color 1A
  5. ECHO         ┏━━━━━━━━━━━━━━━━━━━━┓
  6. ECHO          ┃                        ┃
  7. ECHO    ┏━━━━┫     当前选择: 有规则程序自动合成      ┣━━━━┓
  8. ECHO    ┃      ┃                       ┃      ┃
  9. ECHO    ┃       ┗━━━━━━━━━━━━━━━━━━━━┛      ┃
  10. echo     ┃                       ==处理说明↓==                       ┃
  11. echo.    ┃                                                            ┃
  12. ECHO    ┃    ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛      ┃
  13. echo.    ┃                                                            ┃
  14. echo.    ┏------------------------------------------------------------┓
  15. echo     ┣    ★★★★★★====默认选择==NC==处理。====★★★★★★    ┫
  16. echo.    ┗------------------------------------------------------------┛
  17. echo.    ┃                                                            ┃
  18. echo.    ┣= 请保证该所有程序内刀具无重复即可完成处理=  【0查看说明】  ┫
  19. echo.    ┃                                                            ┃
  20. set /p DJFL=
  21. IF /I '%DJFL%'=='0' GOTO zdhcsm
  22. echo     ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  23. echo     ┃              ===正在处理...以下为刀具信息!====            ┃
  24. pushd "==NC==\"
  25. @echo off&setlocal enabledelayedexpansion
  26. for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"(  Dia:" /c:"(Tool Name:" *.nc') do (
  27.     if "!%%i!" == "" (
  28.        set "str="
  29.        if "%%k" == "" for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
  30.           if "%%c" =="" (
  31.              set D=%%a&set "R=%%b"
  32.           ) else set D=%%c&set "R=%%e"
  33.        ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
  34.                    if "%%d" neq "" (
  35.                       set D=%%a&set "R=%%d"
  36.                    ) else set "str=%%a"
  37.                )
  38.                 if "!str!" == "" for %%f in (D R) do for /f %%h in ("!%%f!") do (
  39.                     set "%%f=%%h"
  40.                     for /l %%e in (1 1 6) do (
  41.                         if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
  42.                     )
  43.                     if "!%%f!" neq "0." (
  44.                        if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
  45.                        if "!%%f!" neq "" set "%%f=%%f!%%f!"
  46.                     ) else set "%%f="
  47.                     set "str=!D!!R!"
  48.                 )
  49. ::==========================修正DxRx==========================
  50.                    set strD=!str:~0,1!
  51.                    if "!strD!" equ "R" (
  52.                   for /f "tokens=1 delims=R" %%h in ("!str!") do set /a strJS=%%h*"2"
  53.                   set str=D!strJS!!str!
  54. )
  55. ::==========================此为按规则合并参数========================
  56.                     md "!str!" 2>nul
  57.                     set "f=%%~ni"
  58.                     set "f=!f:~-2!"
  59.                     set s=-G
  60.                     for %%a in (A R1 F1 -1) do if "!f:%%a=!" neq "!f!" set "s="
  61.                     if not exist "1-!str!!s!.lat" cd.>"1-!str!!s!.lat"
  62. %1 (for /f "tokens=*" %%l in ('%0 : ^|sort') do echo %%l)&pause&exit
  63.                  for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
  64.                  set "str=%%l"
  65.                 set str=!str:*G54.1P=!
  66.                 for /f "delims=G " %%l in ("!str!") do set "str=     %%l"
  67.                        echo !str:~-5!  %%i>>1-!str!!s!.lat
  68.     )
  69.   )
  70. )
  71. echo     ┠──────────────────────────────┨
  72. echo     ┃               ===【刀具分类模拟完成!】===                 ┃
  73. ECHO     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  74. pause
复制代码
是 %1 (for /f "tokens=*" %%l in ('%0 : ^|sort') do echo %%l)&pause&exit 这段代码吗?出现内部命令。。。还是不明白这段代码的工作原理。可以给个相关资料看看么?谢谢。代码很深奥 呵呵。
作者: terse    时间: 2013-7-5 15:04

本帖最后由 terse 于 2013-7-5 15:05 编辑

这样肯定是出错的 写入的话 这样插人试
  1. (for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
  2.     set "var=%%l"
  3.     for /f "delims=G " %%l in ("!var:*G54.1P=!") do set "var= %%l"
  4.         echo !var:~-3!  %%i
  5. ))>$.e
  6. >$.t sort <$.e
  7. (for /f "tokens=*" %%l in ($.t) do echo %%l)>>1-!str!!s!.lat
复制代码
代码最后 写上 del $.?
作者: lateol    时间: 2013-7-5 15:42

回复 12# terse


    再次感谢,,多了两个临时文件 $.e  $.t   处理出来的怎么会是倒序的呢?
作者: terse    时间: 2013-7-5 15:46

不是有 代码最后 写上 del $.? 吗
倒序问题暂时还不清楚 代码顺序排列
作者: lateol    时间: 2013-7-5 15:53

回复 14# terse


    成这样了  
10  002H12-F2.nc
11  002H12-F2.nc
10  002H12-F2.nc
11  002H12-F2.nc
5  002H12-R2.nc
6  002H12-R2.nc
5  002H12-R2.nc
6  002H12-R2.nc
3  13124A1B.nc
4  13124A1BB.nc
2  13124A3B.nc
1  R126B17-3.nc
作者: terse    时间: 2013-7-5 16:02

本帖最后由 terse 于 2013-7-5 16:14 编辑

你是每个文件单独处理的
这样解决问题倍觉累啊
你最好把整个问题表述清楚
弄了两个代码 再去合并运行  会有很多问题 比如 变量问题
猜想你  是否想整个合并的文件排序
那样你最后SORT 反倒觉得前面不需要排序 只管写入好了
作者: terse    时间: 2013-7-5 16:30

本帖最后由 terse 于 2013-7-5 17:39 编辑

回复 15# lateol
帮你整合在一起试吧
里面有重复处理 影响效率 看你的处理量了
  1. @echo off
  2. cls
  3. for /l %%i in (1,1,3) do echo.
  4. color 1A
  5. ECHO         ┏━━━━━━━━━━━━━━━━━━━━┓
  6. ECHO          ┃                        ┃
  7. ECHO    ┏━━━━┫     当前选择: 有规则程序自动合成      ┣━━━━┓
  8. ECHO    ┃      ┃                       ┃      ┃
  9. ECHO    ┃       ┗━━━━━━━━━━━━━━━━━━━━┛      ┃
  10. echo     ┃                       ==处理说明↓==                       ┃
  11. echo.    ┃                                                            ┃
  12. ECHO    ┃    ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛      ┃
  13. echo.    ┃                                                            ┃
  14. echo.    ┏------------------------------------------------------------┓
  15. echo     ┣    ★★★★★★====默认选择==NC==处理。====★★★★★★    ┫
  16. echo.    ┗------------------------------------------------------------┛
  17. echo.    ┃                                                            ┃
  18. echo.    ┣= 请保证该所有程序内刀具无重复即可完成处理=  【0查看说明】  ┫
  19. echo.    ┃                                                            ┃
  20. set /p DJFL=
  21. IF /I '%DJFL%'=='0' GOTO zdhcsm
  22. echo     ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  23. echo     ┃              ===正在处理...以下为刀具信息!====            ┃
  24. pushd "==NC==\"
  25. @echo off&setlocal enabledelayedexpansion
  26. for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"(  Dia:" /c:"(Tool Name:" *.nc') do (
  27.     if "!%%i!" == "" (
  28.        set "str="
  29.        if "%%k" == "" for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
  30.           if "%%c" =="" (
  31.              set D=%%a&set "R=%%b"
  32.           ) else set D=%%c&set "R=%%e"
  33.        ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
  34.                    if "%%d" neq "" (
  35.                       set D=%%a&set "R=%%d"
  36.                    ) else set "str=%%a"
  37.                )
  38.                 if "!str!" == "" for %%f in (D R) do for /f %%h in ("!%%f!") do (
  39.                     set "%%f=%%h"
  40.                     for /l %%e in (1 1 6) do (
  41.                         if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
  42.                     )
  43.                     if "!%%f!" neq "0." (
  44.                        if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
  45.                        if "!%%f!" neq "" set "%%f=%%f!%%f!"
  46.                     ) else set "%%f="
  47.                       set "str=!D!!R!"
  48.                 )
  49. ::==========================修正DxRx==========================
  50.                    set strD=!str:~0,1!
  51.                    if "!strD!" equ "R" (
  52.                       for /f "tokens=1 delims=R" %%h in ("!str!") do set /a strJS=%%h*"2"
  53.                       set str=D!strJS!!str!
  54.                    )
  55. ::==========================此为按规则合并参数========================
  56.                     md "!str!" 2>nul
  57.                     set "f=%%~ni"
  58.                     set "f=!f:~-2!"
  59.                     set "s=-G"
  60.                     for %%a in (A R1 F1 -1) do if "!f:%%a=!" neq "!f!" set "s="
  61.                     (
  62.                     for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
  63.                          if not defined %%i-!str!!s! (
  64.                             set "var=%%l"
  65.                             for /f "delims=G " %%l in ("!var:*G54.1P=!") do (
  66.                                 set "var= %%l"
  67.                                 echo !var:~-2! %%i
  68.                                 set %%i-!str!!s!=i
  69.                             )
  70.                          )
  71.                     )
  72.                     )>>"1-!str!!s!.lat"
  73.                     >$.t sort <"1-!str!!s!.lat"
  74.                     move $.t "1-!str!!s!.lat"
  75.   )
  76. )
  77. echo     ┠──────────────────────────────┨
  78. echo     ┃               ===【刀具分类模拟完成!】===                 ┃
  79. ECHO     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  80. pause
复制代码

作者: lateol    时间: 2013-7-5 17:09

回复 17# terse


    好的,感谢一直帮忙,是这样的,
我是 打算把*.nc 根据文本信息分类且进行按程序名第一个程序相合并,如程序名尾部包含A R1 F1 就合并。
如果直接用 copy 合并,也许顺序就有些混乱,所以就想到, 读取文本信息某特征作为排序特征。
1  R126B17-3.nc 写入对应的.TXT  再对文本进行排序,顺便也想了解了解 是如何完成排序的。呵呵
再利用FOR 提取 每个写入好的txt  提取他的文件名按顺序逐行合并起来就可以了。
作者: terse    时间: 2013-7-5 17:16

如果 lat文件都是刚刚生成的 和没有别的lat文件 那就可以到代码最后再另排序 那样效率可以提高点
作者: lateol    时间: 2013-7-5 17:20

回复 17# terse


    这个排序 可以 不过有点BUG
2 13124A3D.nc
3 13124A1D.nc
4 13124A1DD.nc
5 002H12-R3.nc
5 002H12-R3.nc
6 002H12-R3.nc
6 002H12-R3.nc
10 002H12-F3.nc
10 002H12-F3.nc
11 002H12-F3.nc
11 002H12-F3.nc

002H12-R3.nc 和 02H12-F3.nc这两个文件里面有两个 G54.1PXX  

002H12-R3.nc 里有 G54.1P5和G54.1P6
02H12-F3.nc  里有 G54.1P10和G54.1P11
取他们第一个就好。

处理后效果如
2 13124A3D.nc
3 13124A1D.nc
4 13124A1DD.nc
5 002H12-R3.nc
10 002H12-F3.nc
作者: lateol    时间: 2013-7-5 17:23

回复 19# terse


    今天信息量蛮大的 让您费神了。  领教了 呵呵,
作者: terse    时间: 2013-7-5 17:40

回复 21# lateol
修正在 17楼
作者: lateol    时间: 2013-7-5 18:11

回复 22# terse


    完美!
               set %%i-!str!!s!=i
                    )>>"1-!str!!s!.lat"
                    >$.t sort <"1-!str!!s!.lat"
                    move $.t "1-!str!!s!.lat"
这4行代码可以 详解一下吗?
set %%i-!str!!s!=i  赋值了个 i 吗?
这里的 >$.t   和   sort <"1-!str!!s!.lat"是什么情况。
谢谢
作者: terse    时间: 2013-7-5 18:49

set %%i-!str!!s!=i  赋值  i 与 变量 %%i-!str!!s!
>$.t   和   sort <"1-!str!!s!.lat" 排序文件 1-!str!!s!.lat 并把结果 写进$.t
move $.t "1-!str!!s!.lat" 这个应该清楚吧 可以 move /?  可以等同于剪切理解 ok? 也就是1-!str!!s!.lat内容替换为 $.t 的内容




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