标题: [文本处理] 批处理如何取字段之间内容行? [打印本页]
作者: 娜美 时间: 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 编辑
- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- $a=gc -readcount 0 D:\Test-UFT-16.txt
- $b=($a[-1..-10] -match '企业')[0] -replace '.*简名:(.*?)\s.*','$1'
- 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以内可以自己加- $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> 企业 简名:科尔达 ***:**:** (* ,)
名字里有空格可以讲讲红字的***是数字还是别的什么吗?- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- $a=gc -readcount 0 D:\Test-UFT-16.txt
- $b=($a[-1..-1000] -match '企业')[0] -replace '.*简名:\s*(.*)\s\S*:.*','$1'
- $f=0
- 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 |