Powershell -捕获两个值之间的所有行,并将捕获的行保存到Excel可以读取的文件中



我需要捕获每一行包含"*"在鉴定科和环境科之间的位置7。所有其他数据都可以忽略,一旦我点击环境分区,我就可以退出文件。

鉴定科和环境科都从位置8开始。

这是我的数据的一个例子

IDENTIFICATION DIVISION.
****************************************************************  00000700
****************************************************************  00000800
* PURPOSE:  TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING *  00000900
*           AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER     *  00001000
*           OR TERRITORY.                                      *  00001100
*           CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST     *  00001110
*           PROCESS-AAGYZ105.                                  *  00001110
****************************************************************  00001300
ENVIRONMENT DIVISION.

下面是@Olaf的代码。我添加了创建添加和关闭excel电子表格的逻辑。工作好!

谢谢你@雪宝!!
$excel = New-Object -ComObject excel.application
$excel.visible = $False
$workbook = $excel.Workbooks.Add()
$diskSpacewksht= $workbook.Worksheets.Item(1)
$diskSpacewksht.Name = "CAPTURE"
$col1=3
$diskSpacewksht.Cells.Item(2,8) = 'Header - Deletes'
$diskSpacewksht.Cells.Item(3,1) = 'Program'
$diskSpacewksht.Cells.Item(3,2) = 'Description'
$CBLFileList = Get-ChildItem -Path 'C:TEMP' -Filter '*.cbl' -File -Recurse
$Flowerbox = @()
ForEach($CBLFile in $CBLFileList) {
Write-Host "Processing ... $CBLFile" -foregroundcolor green      
Get-content -Path $CBLFile.FullName |
ForEach-Object {
if ($_ -match 'IDENTIFICATION DIVISION') {
$treat = $true
}
if ($_ -match 'ENVIRONMENT DIVISION') {
$col1++
$diskSpacewksht.Cells.Item($col1,1) = $CBLFile
$diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
$Flowerbox = @()
continue
}
if ($treat) {
if ($_ -match '*(.{60})') {
Foreach-Object {$Flowerbox += $matches[1] + "`r`n"}
}
}
}

}
$excel.DisplayAlerts = 'False'
$ext=".xlsx"
$path="C:MISCCAPTURE$ext"
$workbook.SaveAs($path) 
$workbook.Close
$excel.DisplayAlerts = 'False'
$excel.Quit()

如果您的输入文件始终具有您在代码片段中显示的格式,那么您的任务可能比您想象的要容易:;-)

$CBLFileList = 
Get-ChildItem -Path 'D:sample' -Filter '*.cbl' -File -Recurse
$output = 
ForEach($CBLFile in $CBLFileList) {
Get-content -Path $CBLFile.FullName |
ForEach-Object {
if ($_ -match 'IDENTIFICATION DIVISION') {
$treat = $true
}
if ($_ -match 'ENVIRONMENT DIVISION.') {
continue
}
if ($treat) {
if ($_ -match '*s(.{60})') {
[PSCustomObject]@{
Path = $CBLFile.FullName
Catch = $Matches[1]
}
}
}
}
}
$output

代码忽略输入文件的所有行,直到遇到第一行带有'IDENTIFICATION DIVISION'的行,然后解析所有行,直到遇到第一行带有'ENVIRONMENT DIVISION'的行。

应该输出你想要的结果。我只是觉得把它传输到CSV文件不是个好主意。

正则表达式正在查找一些任意字符,在单个星号后面跟着一个或多个空格,然后再跟着一个或多个空格后面跟着一个星号。

这个怎么样?

Clear-Host
$StringData = '
IDENTIFICATION DIVISION.
****************************************************************  00000700
****************************************************************  00000800
* PURPOSE:  TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING *  00000900
*           AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER     *  00001000
*           OR TERRITORY.                                      *  00001100
*           CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST     *  00001110
*           PROCESS-AAGYZ105.                                  *  00001110
****************************************************************  00001300
ENVIRONMENT DIVISION.
'  
[regex]::Match($StringData, '(?is)(?<=bIDENTIFICATION DIVISIONb.).*?(?=bENVIRONMENT DIVISIONb)').Value
# Results
<#
****************************************************************  00000700
****************************************************************  00000800
* PURPOSE:  TO PERFORM THE I/O LOGIC TO RETRIEVE THE CREDITING *  00000900
*           AGENTS FOR THE SPLIT AGREEMENTS FOR A CUSTOMER     *  00001000
*           OR TERRITORY.                                      *  00001100
*           CUSTOMIZED VERSION OF ADMLR301 FOR MONTHLY DST     *  00001110
*           PROCESS-AAGYZ105.                                  *  00001110
****************************************************************  00001300
#>

最新更新