Board logo

标题: [文本处理] 批处理如何提取文本中指定位置的内容? [打印本页]

作者: 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文本最后需要有一个回车换行,否则可能出错
  1. @if (0)==(0) echo off
  2. findstr /i "^BC" *.txt | cscript //nologo //e:jscript "%~0" > a.log
  3. pause & exit
  4. @end
  5. WSH.StdIn.ReadAll().replace(
  6.     /.+?:([^,]*,){8}(\d+\.?\d*),([^,]*,){4}(.+)\r\n/g,
  7.     function(s0,s1,s2,s3,s4){ if (s2*1>25) WSH.Echo(s4) }
  8. )
复制代码

作者: 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你这文件里面怎么还有全角逗号,
假设全都是半角逗号的话
  1. @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处理起来多爽,简洁明了
  1. #&cls&gawk -F "[,,]" -f "%~f0" *.txt >new.txt&pause
  2. /^BC/ && $9 > 25 {print $14","$15}
复制代码





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