Powershell:使用从标记之间提取的值创建表,不使用白色(以;)

wmomyfyw  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(84)

我有一个文本文件,看起来像下面的,其中包含一个表在第8行。现在,该表可以在长度上变化,但它总是包含4个值每行。
输入档案:

0001117945
14102022
0001056.98
GBP
0000000.00
0000000.00
\\GLORSAWA01\EHIShared\Remittance\UK01\UKI_REM_COL58652cbc13ca49aabf000.pdf                                                                                                                                                                                         
<LineItemTable><LINEITEM><LINEITEMFIELD>20220916</LINEITEMFIELD><LINEITEMFIELD>2525636         </LINEITEMFIELD><LINEITEMFIELD>0.00                            </LINEITEMFIELD><LINEITEMFIELD>246.05                          </LINEITEMFIELD></LINEITEM><LINEITEM><LINEITEMFIELD>20220920</LINEITEMFIELD><LINEITEMFIELD>2527541         </LINEITEMFIELD><LINEITEMFIELD>0.00                            </LINEITEMFIELD><LINEITEMFIELD>450.12                          </LINEITEMFIELD></LINEITEM><LINEITEM><LINEITEMFIELD>20220922</LINEITEMFIELD><LINEITEMFIELD>2531147         </LINEITEMFIELD><LINEITEMFIELD>0.00                            </LINEITEMFIELD><LINEITEMFIELD>360.81                          </LINEITEMFIELD></LINEITEM></LineItemTable>

第8行中的表结构始终相同,并且看起来与下面类似(格式化只是为了更好地查看)。

<LineItemTable>
    <LINEITEM>
        <LINEITEMFIELD>20220916</LINEITEMFIELD>
        <LINEITEMFIELD>2525636         </LINEITEMFIELD>
        <LINEITEMFIELD>0.00                            </LINEITEMFIELD>
        <LINEITEMFIELD>246.05                          </LINEITEMFIELD>
    </LINEITEM>
    <LINEITEM>
        <LINEITEMFIELD>20220920</LINEITEMFIELD>
        <LINEITEMFIELD>2527541         </LINEITEMFIELD>
        <LINEITEMFIELD>0.00                            </LINEITEMFIELD>
        <LINEITEMFIELD>450.12                          </LINEITEMFIELD>
    </LINEITEM>
    <LINEITEM>
        <LINEITEMFIELD>20220922</LINEITEMFIELD>
        <LINEITEMFIELD>2531147         </LINEITEMFIELD>
        <LINEITEMFIELD>0.00                            </LINEITEMFIELD>
        <LINEITEMFIELD>360.81                          </LINEITEMFIELD>
    </LINEITEM>
</LineItemTable>

我尝试从文本文件中提取所有值并将它们写入另一个文件,但我希望保留前7行,然后将第8行的值显示在多行中,并以分隔;没有白色。
所需的输出文件:

0001117945
14102022
0001056.98
GBP
0000000.00
0000000.00
\\GLORSAWA01\EHIShared\Remittance\UK01\UKI_REM_COL58652cbc13ca49aabf000.pdf                                                                                                                                                                                         
20220916;2525636;0.00;246.05
20220920;2527541;0.00;450.12
20220922;2531147;0.00;360.81

这是我走了多远,但我不能得到表从第8行转换成我想要的输出。任何帮助将不胜感激。

$importfolder = ".\PowerShell_script\" 
$outputfolder = ".\PowerShell_script\Output\"
$files = ".\PowerShell script\*.txt" 
$list = Get-ChildItem -Path $files | select Name

$find1 = "<LineItemTable><LINEITEM><LINEITEMFIELD>"
$find2 = "</LINEITEMFIELD><LINEITEMFIELD>" 
$find3 = "</LINEITEMFIELD></LINEITEM><LINEITEM><LINEITEMFIELD>"

$replace1 = ""
$replace2 = "`t" 
$replace3 = "`n"

ForEach($file in $list){
  
    echo $file.Name
    $filename = $file.Name
    $file = $importfolder + $file.Name
    $outputfile = $outputfolder + $filename

    $filecontent = Get-Content $file | 
    ForEach-Object { 
        if($_ -Match $find1)
            {$_ -replace $replace1}         

        if($_ -Match $find2)
            {$_ -replace $replace2} 

        if($_ -Match $find3)
            {$_ -replace $replace3} 

        else {$_} # output the line as is
     } | Set-Content $outputfile
}
von4xj4u

von4xj4u1#

看起来此逻辑对于所讨论的示例文件工作正常:

$file = Get-Content path\to\examplefile.txt
$(
    $file[0..($file.Length - 2)]
    ($file[-1] -as [xml]).SelectNodes('*/LINEITEM').ForEach{
        $_.LINEITEMFIELD.Trim() -join ';'
    }
)

基本上,保留所有行,直到倒数第二行,最后一行将其视为XML。
在您的循环中实作这个,程式码看起来会像这样:

foreach($file in $list) {
    $filename   = $file.Name
    $file       = $importfolder + $file.Name
    $outputfile = $outputfolder + $filename

    $content = Get-Content $file
    $(
        $content[0..($content.Length - 2)]
        ($content[-1] -as [xml]).SelectNodes('*/LINEITEM').ForEach{
            $_.LINEITEMFIELD.Trim() -join ';'
        }
    ) | Set-Content $outputfile
}

相关问题