Powershell:搜索位置 68-70 中的匹配项,然后提取字段位置 2-9 [重复]

Powershell: Search for a match in position 68-70 then extract field position 2-9 [duplicate]

提问人:user3166462 提问时间:2/23/2022 最后编辑:mklement0user3166462 更新时间:2/24/2022 访问量:56

问:

我需要拆分一个包含 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
}
PowerShell 搜索 匹配

评论

1赞 Mathias R. Jessen 2/23/2022
文件中的文件名可以有空格,还是总是由连续的字母组成?
0赞 user3166462 2/23/2022
嗨,@MathiasR.Jessen,不,他们的名字中不能有空格。-罗恩
0赞 PollusB 2/23/2022
您好,您能提供与 NEWTEXT= 匹配的行的示例吗?

答:

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