Board logo

标题: [文本处理] 批处理如何取字段之间内容行? [打印本页]

作者: 娜美    时间: 2022-1-21 22:30     标题: 批处理如何取字段之间内容行?

本帖最后由 娜美 于 2022-1-23 19:34 编辑

取字段之间内容行   谢谢


如果倒数第一个有"企业"字段, 右侧是名称, 就截取该名称字段至"已执行"之间内容行,


但是倒数第一个有"企业"字段右侧名称会随系统记录不同着名称,  有时可能是科尔达, 也有可能联发科,  还有可能是其它一些名称, 并不是固定


双击脚本时廷时5秒执行,   完成后打开该输出文件


120秒后自动关闭打开的文件


进出文件可选择路径例如 D:\A

因为是一个300mgb左右文件 是UFT-16编码,  最理想是不用做转编码这一步,因为对原文件做转编码需求,用awk实现了,  现在是想不用做转编码而是直接对UFT-16编码原文件进行处理,  因为要考虑代码执行过程及效率


BAT  Powershell都喜欢,  如果是Powershell最好能放在BAT脚本就能执行






似乎可以把>看成分隔符  这样整行就看成2列了   仅需匹配第2列    似乎更好


还可以把空格看成分隔符,  第$5段是"企业"   第$6段是"简名:联发科"  第$7段是"***:**:**"  
然后锁定"企业"字段行的 $5,$6,$7列   第5列是要开始截取"企业"字段  然后匹配$6,$7列字符串就ok ?

当然你们觉得怎么好就怎么来

这只是个人一些入手想法
作者: idwma    时间: 2022-1-22 14:28

本帖最后由 idwma 于 2022-1-22 15:03 编辑
  1. #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
  2. $a=gc -readcount 0 D:\Test-UFT-16.txt
  3. $b=($a[-1..-10] -match '企业')[0] -replace '.*简名:(.*?)\s.*','$1'
  4. sc -enc unicode D:\out.txt ("$a" -split '(?<=已执行).' -split ".(?=\d\d:\d\d:\d\d.*企业 简名:$b)" -match "$b" -join "`r`n`r`n" -split '.(?=\d\d:\d\d:\d\d)')
复制代码

作者: 娜美    时间: 2022-1-22 16:26

本帖最后由 娜美 于 2022-1-22 16:48 编辑

回复 2# idwma


   谢谢,   按测试文本是可以,  但是如果内容结构复杂一点输出就不准确了   
似乎问题出在   在文本最后的内容上

我偿试在文本胡乱添加一些行,  会导致输出不准确

在文本最后加上这些行
j
k
l
g
f
d
s
作者: 娜美    时间: 2022-1-22 16:50

本帖最后由 娜美 于 2022-1-22 16:54 编辑
回复  娜美


    最后的内容是什么样的?
idwma 发表于 2022-1-22 16:46



   我偿试在文本胡乱添加这些行,  就会导致输出不准确,   可能需要忽略文本不同内容行
您也可以试试在文本内加上其它不同内容测试    可能需要考虑到文本内复杂结构,
作者: idwma    时间: 2022-1-22 17:18

本帖最后由 idwma 于 2022-1-22 17:20 编辑

回复 3# 娜美

第三行改成这样试试,这里-1..-1000是倒数-1行到-1000,原来的10可能小了,如果最后出现企业的行不在1000以内可以自己加
  1. $b=($a[-1..-1000] -match '企业')[0] -replace '.*简名:(.*?)\s.*','$1'
复制代码

作者: 娜美    时间: 2022-1-22 17:32

回复 5# idwma


   现在可以了   谢谢   但是有点慢100mb文本需要很久
还可以加快一点吗 ?
作者: idwma    时间: 2022-1-22 18:21

回复 6# 娜美
不会了
作者: 娜美    时间: 2022-1-22 18:30

回复 7# idwma


   谢谢idwma哥
作者: 娜美    时间: 2022-1-23 11:28

本帖最后由 娜美 于 2022-1-23 19:35 编辑

idwma哥 似乎还有点小问题需要您再改一下  如果下面这种内容  以倒数第一个企业字段为准,   截取其它第一个匹配到的企业字段至已执行内容行, 但现在代码测试到丢失了中间行  似乎会忽略了名称空格   
作者: idwma    时间: 2022-1-23 14:46

本帖最后由 idwma 于 2022-1-23 15:46 编辑

10:18:17 January 21 2022> 企业 简名:科尔达 ***:**:** (* ,)
名字里有空格可以讲讲红字的***是数字还是别的什么吗?
  1. #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
  2. $a=gc -readcount 0 D:\Test-UFT-16.txt
  3. $b=($a[-1..-1000] -match '企业')[0] -replace '.*简名:\s*(.*)\s\S*:.*','$1'
  4. $f=0
  5. sc D:\out.txt $(foreach($i in $a){if(($f -eq 0) -and $i -match "$b"){$i;$f=1}elseif(($f -eq 1) -and $i -match '已执行'){$f=0;$i,''}elseif($f -eq 1){$i}})
复制代码

作者: 娜美    时间: 2022-1-23 15:16

本帖最后由 娜美 于 2022-1-23 19:35 编辑
10:18:17 January 21 2022> 企业 简名:科尔达 ***:**:** (* ,)
名字里有空格可以讲讲红字的***是数字还是别 ...
idwma 发表于 2022-1-23 14:46





*是代表其它字符也有大写字母及数字


我觉得可以把这一段看成一个企业的全名称, 只要匹配简名:右则起的这一段字符串就可以了


作者: idwma    时间: 2022-1-23 15:47

回复 11# 娜美


    改了
作者: 娜美    时间: 2022-1-23 16:22

回复 12# idwma


   非常谢谢正确了




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