标题: [文本处理] [已解决]批处理命令FOR如何取TXT文本指定的数值赋予多个变量? [打印本页]
作者: lateol 时间: 2013-7-5 11:28 标题: [已解决]批处理命令FOR如何取TXT文本指定的数值赋予多个变量?
本帖最后由 lateol 于 2013-7-5 19:48 编辑
如我用以下代码获取一些文本的内容- @echo off
- for /f "tokens=* delims=PG" %%l in ('findstr /ic:"G54.1P" *.nc') do (
- echo %%l>>1.txt
- )
- 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 编辑
这样吗?- @echo off&setlocal enabledelayedexpansion
- %1 %0 : |sort&pause&exit
- for /f "tokens=1* delims=:" %%i in ('findstr /ic:G54.1P *.nc') do (
- set "str=%%j"
- set str=!str:*G54.1P=!
- echo !str:~,1! %%i
- )
复制代码
发出代码 才看到你的回复说 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
仅针对你的资料- @echo off&setlocal enabledelayedexpansion
- %1 (for /f "tokens=*" %%i in ('%0 : ^|sort') do echo %%i)&pause&exit
- for /f "tokens=1* delims=:" %%i in ('findstr /ic:G54.1P *.nc') do (
- set "str=%%j"
- set str=!str:*G54.1P=!
- for /f "delims=G " %%j in ("!str!") do set "str= %%j"
- echo !str:~-5! %%i
- )
-
复制代码
作者: 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 - @echo off
- cls
- for /l %%i in (1,1,3) do echo.
- color 1A
- ECHO ┏━━━━━━━━━━━━━━━━━━━━┓
- ECHO ┃ ┃
- ECHO ┏━━━━┫ 当前选择: 有规则程序自动合成 ┣━━━━┓
- ECHO ┃ ┃ ┃ ┃
- ECHO ┃ ┗━━━━━━━━━━━━━━━━━━━━┛ ┃
- echo ┃ ==处理说明↓== ┃
- echo. ┃ ┃
- ECHO ┃ ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛ ┃
- echo. ┃ ┃
- echo. ┏------------------------------------------------------------┓
- echo ┣ ★★★★★★====默认选择==NC==处理。====★★★★★★ ┫
- echo. ┗------------------------------------------------------------┛
- echo. ┃ ┃
- echo. ┣= 请保证该所有程序内刀具无重复即可完成处理= 【0查看说明】 ┫
- echo. ┃ ┃
- set /p DJFL=
- IF /I '%DJFL%'=='0' GOTO zdhcsm
- echo ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
- echo ┃ ===正在处理...以下为刀具信息!==== ┃
- pushd "==NC==\"
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"( Dia:" /c:"(Tool Name:" *.nc') do (
- if "!%%i!" == "" (
- set "str="
- if "%%k" == "" for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
- if "%%c" =="" (
- set D=%%a&set "R=%%b"
- ) else set D=%%c&set "R=%%e"
- ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
- if "%%d" neq "" (
- set D=%%a&set "R=%%d"
- ) else set "str=%%a"
- )
-
- if "!str!" == "" for %%f in (D R) do for /f %%h in ("!%%f!") do (
- set "%%f=%%h"
- for /l %%e in (1 1 6) do (
- if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
- )
-
- if "!%%f!" neq "0." (
- if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
- if "!%%f!" neq "" set "%%f=%%f!%%f!"
- ) else set "%%f="
- set "str=!D!!R!"
- )
- ::==========================修正DxRx==========================
- set strD=!str:~0,1!
- if "!strD!" equ "R" (
- for /f "tokens=1 delims=R" %%h in ("!str!") do set /a strJS=%%h*"2"
- set str=D!strJS!!str!
- )
- ::==========================此为按规则合并参数========================
- md "!str!" 2>nul
- set "f=%%~ni"
- set "f=!f:~-2!"
- set s=-G
- for %%a in (A R1 F1 -1) do if "!f:%%a=!" neq "!f!" set "s="
- if not exist "1-!str!!s!.lat" cd.>"1-!str!!s!.lat"
-
- %1 (for /f "tokens=*" %%l in ('%0 : ^|sort') do echo %%l)&pause&exit
- for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
- set "str=%%l"
- set str=!str:*G54.1P=!
- for /f "delims=G " %%l in ("!str!") do set "str= %%l"
- echo !str:~-5! %%i>>1-!str!!s!.lat
- )
- )
- )
- echo ┠──────────────────────────────┨
- echo ┃ ===【刀具分类模拟完成!】=== ┃
- ECHO ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
- 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 编辑
这样肯定是出错的 写入的话 这样插人试- (for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
- set "var=%%l"
- for /f "delims=G " %%l in ("!var:*G54.1P=!") do set "var= %%l"
- echo !var:~-3! %%i
- ))>$.e
- >$.t sort <$.e
- (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
帮你整合在一起试吧
里面有重复处理 影响效率 看你的处理量了- @echo off
- cls
- for /l %%i in (1,1,3) do echo.
- color 1A
- ECHO ┏━━━━━━━━━━━━━━━━━━━━┓
- ECHO ┃ ┃
- ECHO ┏━━━━┫ 当前选择: 有规则程序自动合成 ┣━━━━┓
- ECHO ┃ ┃ ┃ ┃
- ECHO ┃ ┗━━━━━━━━━━━━━━━━━━━━┛ ┃
- echo ┃ ==处理说明↓== ┃
- echo. ┃ ┃
- ECHO ┃ ┗━━直接按回车默认选择“==NC==”文件夹处理━━┛ ┃
- echo. ┃ ┃
- echo. ┏------------------------------------------------------------┓
- echo ┣ ★★★★★★====默认选择==NC==处理。====★★★★★★ ┫
- echo. ┗------------------------------------------------------------┛
- echo. ┃ ┃
- echo. ┣= 请保证该所有程序内刀具无重复即可完成处理= 【0查看说明】 ┫
- echo. ┃ ┃
- set /p DJFL=
- IF /I '%DJFL%'=='0' GOTO zdhcsm
- echo ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
- echo ┃ ===正在处理...以下为刀具信息!==== ┃
- pushd "==NC==\"
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2* delims=:" %%i in ('findstr /ic:"TOOL NAME = " /c:"(Cutter Name:" /c:"( DIA. = " /c:"( Dia:" /c:"(Tool Name:" *.nc') do (
- if "!%%i!" == "" (
- set "str="
- if "%%k" == "" for /f "tokens=2-6 delims==,)" %%a in ("%%j") do (
- if "%%c" =="" (
- set D=%%a&set "R=%%b"
- ) else set D=%%c&set "R=%%e"
- ) else for /f "tokens=1-6 delims=:) " %%a in ("%%k") do (
- if "%%d" neq "" (
- set D=%%a&set "R=%%d"
- ) else set "str=%%a"
- )
-
- if "!str!" == "" for %%f in (D R) do for /f %%h in ("!%%f!") do (
- set "%%f=%%h"
- for /l %%e in (1 1 6) do (
- if "!%%f:~-1!" == "0" set "%%f=!%%f:~,-1!"
- )
-
- if "!%%f!" neq "0." (
- if "!%%f:~-1!" == "." set "%%f=!%%f:~,-1!"
- if "!%%f!" neq "" set "%%f=%%f!%%f!"
- ) else set "%%f="
- set "str=!D!!R!"
- )
- ::==========================修正DxRx==========================
- set strD=!str:~0,1!
- if "!strD!" equ "R" (
- for /f "tokens=1 delims=R" %%h in ("!str!") do set /a strJS=%%h*"2"
- set str=D!strJS!!str!
- )
- ::==========================此为按规则合并参数========================
- md "!str!" 2>nul
- set "f=%%~ni"
- set "f=!f:~-2!"
- set "s=-G"
- for %%a in (A R1 F1 -1) do if "!f:%%a=!" neq "!f!" set "s="
- (
- for /f "tokens=* delims=:" %%l in ('findstr /ic:G54.1P %%i') do (
- if not defined %%i-!str!!s! (
- set "var=%%l"
- for /f "delims=G " %%l in ("!var:*G54.1P=!") do (
- set "var= %%l"
- echo !var:~-2! %%i
- set %%i-!str!!s!=i
- )
- )
- )
- )>>"1-!str!!s!.lat"
- >$.t sort <"1-!str!!s!.lat"
- move $.t "1-!str!!s!.lat"
- )
- )
-
- echo ┠──────────────────────────────┨
- echo ┃ ===【刀具分类模拟完成!】=== ┃
- ECHO ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
- 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 |