标题: [文本处理] 批处理如何提取文本中指定位置的内容? [打印本页]
作者: zhifuz 时间: 2016-2-19 20:40 标题: 批处理如何提取文本中指定位置的内容?
D:\1\下有很多txt文件
以下是txt文件中的内容
1.txt
VI,015, A,R,4,"RRE,01502,A,044,04"
VI,016, 71601,A,044,04"
BC,NS,1,1,L,1, 406.166, 406.166,28.53,U,6,33.80,-99999.99,3333,a
BC,NS,2,1,L,2, 98.633, 98.633,20.51,U,6,33.80,-99999.99,4444,c
BC,NS,3,1,L,3, 586.001, 586.001,28.42,U,6,34.80,-99999.99,5555,r
BC,NS,4,1,L,4, 586.001, 86.001,18.42,U,6,35.80,-99999.99,6666,g
2.txt
VI,015, A,R,4,"RRE,01502,A,044,04"
VI,016, 71601,A,044,04"
BC,NS,1,1,R,1, 406.166, 406.166,19.43,U,6,33.80,-99999.99,7777,ca
BC,NS,2,1,L,2, 98.633, 98.633,20.31,U,6,33.80,-99999.99,8888,cc
BC,NS,3,1,L,3, 586.001, 586.001,26.45,U,6,34.80,-99999.99,9999,rt
BC,NS,4,1,L,4, 586.001, 86.001,15.62,U,6,35.80,-99999.99,0000,b
等等很多文本文件
要做的是 查看带有BC开头(BC有很多行)的记录,第8个逗号之后的数字如果大于25则将 本行第13个和第14个逗号后的数字写入另一个文本文件中即可,
例如上两个可以写成如下:
3333,a
5555,r
9999,rt
非常感谢!!!
作者: WHY 时间: 2016-2-19 22:02
本帖最后由 WHY 于 2016-2-19 22:30 编辑
每个txt文本最后需要有一个回车换行,否则可能出错- @if (0)==(0) echo off
- findstr /i "^BC" *.txt | cscript //nologo //e:jscript "%~0" > a.log
- pause & exit
- @end
-
- WSH.StdIn.ReadAll().replace(
- /.+?:([^,]*,){8}(\d+\.?\d*),([^,]*,){4}(.+)\r\n/g,
- function(s0,s1,s2,s3,s4){ if (s2*1>25) WSH.Echo(s4) }
- )
复制代码
作者: wskwfkbdn 时间: 2016-2-19 22:21
typex *.txt |findstr /i "^BC"
或
type *.txt |findstr /i "^BC"
typex命令行工具(type命令的增强版)20160215
地址 http://www.bathome.net/viewthread.php?tid=39376
过滤出来的字符串for命令处理下就行了,这里我就不写了
作者: k1314521jx 时间: 2016-2-19 22:30
本帖最后由 k1314521jx 于 2016-2-20 23:55 编辑
@echo off & setlocal enabledelayedexpansion
for /f "tokens=4" %%a in ('dir D:\1 ^| find /i ".txt"') do (
for /f "delims=, tokens=9,14,15" %%i in ( %%a ) do (
set var=%%i
set m=!var:~,2!
if !m! geq 25 echo %%j%%k>>text.txt
)
)
pause
把上面代码到你的D:\1\ 目录下运行
我测试了一下我这是ok的 在你电脑上看看 有问题的话应该是dir d:\1 这输出的显示和我这不同,不过该一下tokens就能搞定
作者: codegay 时间: 2016-2-19 23:30
回复 2# WHY
为啥先*1啊。
作者: 阿乐 时间: 2016-2-20 11:06
学习了 好厉害
作者: bailong360 时间: 2016-2-20 11:16
话说LZ你这文件里面怎么还有全角逗号,
假设全都是半角逗号的话- @grep -hP "^BC(,[^,]+){7},(([2][5-9])|([3-9][0-9])|\d{3,)[^,]*," *.txt|grep -o "[^,]*,[^,]*$" >New.txt
复制代码
作者: zhifuz 时间: 2016-2-20 23:40
回复 2# WHY
看不太明白???
作者: zhifuz 时间: 2016-2-20 23:41
@echo off & setlocal enabledelayedexpansion
for /f "tokens=4" %%a in ('dir D:\1 ^| find /i ".txt"') ...
k1314521jx 发表于 2016-2-19 22:30
在文本1.txt中增加一行,输出结果就不对了。
作者: k1314521jx 时间: 2016-2-20 23:59
回复 9# zhifuz
应该不是加一行的原因,我把要比较的数,取整了,导致像25.08这样的数不会被提取出来,把等于改成大于等于就不会漏掉。不过楼主说的输出结果有误具体是指?
作者: zhifuz 时间: 2016-2-21 01:09
本帖最后由 zhifuz 于 2016-2-21 01:30 编辑
回复 zhifuz
应该不是加一行的原因,我把要比较的数,取整了,导致像25.08这样的数不会被提取出 ...
k1314521jx 发表于 2016-2-20 23:59
是您说的原因。谢谢了。
再次请教,1、如果我想出第9位之前的某些位数字呢?
2、如果后面还有很多逗号,很多字符串,也要提取,怎么写呢?
作者: codegay 时间: 2016-2-21 07:18
回复 11# zhifuz
最简单最常用的无非是分隔符切分列。你自己把for 命令学了这些都不难。
稍难一点的是正则表达式匹配。
作者: bailong360 时间: 2016-2-21 09:51
这种文件用gawk处理起来多爽,简洁明了- #&cls&gawk -F "[,,]" -f "%~f0" *.txt >new.txt&pause
- /^BC/ && $9 > 25 {print $14","$15}
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |