提问人:user3166462 提问时间:2/23/2022 最后编辑:mklement0user3166462 更新时间:2/24/2022 访问量:56
Powershell:搜索位置 68-70 中的匹配项,然后提取字段位置 2-9 [重复]
Powershell: Search for a match in position 68-70 then extract field position 2-9 [duplicate]
问:
我需要拆分一个包含 10K+ 行的文本文件,其中一些包含有关文件的信息。每行感兴趣的字符串都位于位置(列)68-70,文件的名称 - 这是我尝试提取的信息 - 位于位置 2-9。"VER"
它看起来像这样......
文件名是ACCRLINK
ACCRLINK VER 1 176 D 03/09/98 02/21/84
下面是我使用伪代码的尝试,希望能说明我所追求的。
谁能帮我更改脚本以按位置选择并在另一个位置捕获文件名?
谢谢
-罗恩
$InputFile = "C:\RECORDS_cpy.txt"
$Reader = New-Object System.IO.StreamReader($InputFile)
#$a = 1
$OPName = @()
While (($Line = $Reader.ReadLine()) -ne $null) {
If ($Line -match "VER"(68,3)) {
$OPName = $Line(2,8)
$FileName = $OPName.Trim()
Write-Host "Found ... $FileName" -foregroundcolor green
$OutputFile = "$FileName.txt"
#$a++
}
Add-Content $OutputFile $Line
}
答:
0赞
Darin
2/23/2022
#1
此代码忽略位置问题,并完全查看模式。您需要具有“NEWTEXT”和“=”的行,然后是所需的文本,然后是 VER 和其他一些随机文本。
function GetFileNames([string]$FileName) {
switch -Regex -File $FileName {
'^\s*NEWTEXT\s*=\s*(?<File>.*?)\s*VER\s*.*$' {$Matches.File}
default {continue}
}
}
$InputFile = "C:\RECORDS_cpy.txt"
$OutFile = "C:\RECORDS_Results.txt"
GetFileNames $InputFile | Out-File $OutFile
运行时,文件 C:\RECORDS_Results.txt 包含以下内容:
ACCRLINK
评论
0赞
user3166462
2/24/2022
嗨,达林..我修改了上面的脚本,看起来有点像我需要的。由于语法原因,该脚本不再有效,但希望它能显示我正在寻找的内容。我需要验证字母“VER”是否出现在一行的 68-70 位置。如果是,我需要捕获同一行上位置 2-9 的字符。这可能吗?-罗恩
0赞
user3166462
2/24/2022
伙计们 - 这是我的错 - 我问错了问题,没有提供足够的背景。我将从头开始一个新线程,并尽可能多地添加信息。谢谢大家的帮助 - 下个话题见!!!-罗恩
1赞
Darin
2/24/2022
User3166462,“但是,这种基于子字符串的方法不起作用”有点让我陷入了循环。如果我们不能使用 $Line.Substring(68,3) 等命令,我们如何测试“VER”的内容。同样,如果我们可以做 $Line.Substring(2,8),我们如何获取文件名?您抱怨 Substring 方法不起作用,因此我们为您提供了替代方案 - 但您不喜欢替代方案。
0赞
mklement0
2/24/2022
@Darin,我把这句话编辑到问题中,我发现它是模棱两可的:我应该说“子字符串匹配方法”,它指的是原始方法(从问题中删除)。由于 Ron 已经替换了该代码,因此我再次编辑了该问题。简而言之:是的,查看固定位置的子字符串是一项要求,这可以通过多个调用来完成,或者更简洁地说,使用单个正则表达式来完成。-match "NEWTEXT="
.Substring()
0赞
mklement0
2/24/2022
从那以后,罗恩发布了一个包含更多细节的新问题,所以我已经关闭了这个问题作为重复项(尽管最好删除它):stackoverflow.com/q/71242192/45375
评论