使用 PowerShell 脚本分割大型 XML 文件的最快方法 -57000 条记录,400 万行

问题描述 投票:0回答:1

我正在 PowerShell 上运行脚本来拆分 115MB XML 文件。它包含超过 50,000 条记录,在 notepad++ 上打开时行数高达 400 万行。每条记录包含多个节点,其中一个节点有一个金额数字。

文件中的页脚汇总了记录总数以及从每条记录读取的总金额。我还没有添加此页脚检查,因为我仍在努力拆分文件作为概念证明。在我最近的 3 次尝试中,脚本运行了超过 18 小时,我不得不终止,但没有任何成功的结果。运行这个程序最快的方法是什么?这是我的脚本:

$limit = 10000
$logpath = "C:\Users\K_iduli\Downloads\ABC_Documents_CREATE_FINRECORD_20240912_3.xml"
[xml]$xml="<DocList>$(Get-Content $logpath)</DocList>"
$index = 1
$ref = new-object xml
$rows = $xml.SelectNodes("//Doc")
$c = $rows.count
$rows | %{
    if($index -eq 1){
        [xml]$insertNode = @"
<DocList><a></a></DocList>
"@
     $ref.AppendChild($ref.ImportNode($InsertNode.DocumentElement, $false))
    }
    $ref.DocumentElement.AppendChild($ref.ImportNode($_,$true))
    $c--
    if($index -eq $limit){
        $index = 1
        $ref.Save("C:\Users\K_iduli\Downloads\Test\ABC_Documents_CREATE_FINRECORD_20240912_{0:D6}.xml" -f ++$i)
        $ref = new-object xml
        if($c -lt $limit){$limit = $c}
    }
    else{
      $index++;
    }
}

我希望我的脚本在位置 C:\Users\K_iduli\Downloads\Test\ABC_Documents_CREATE_FINRECORD_20240912 中创建最多六个文件,但是,该文件夹仍然为空,并且该过程尚未成功。

xml powershell
1个回答
0
投票

嗯,我不知道它是否是最快的,但应该很容易超过 18 小时,这太荒谬了。我没有尝试从您的代码中对您的需求进行逆向工程,但是 XSLT 2.0+ 样式表可以做到这一点

<xsl:transform version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <xsl:for-each-group select="*/*" group-adjacent="(position()-1) idiv 200">
    <xsl:result-document href="out{position()}.xml">
       <batch>
         <xsl:copy-of select="."/>
       </batch>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>
</xsl:transform> 

应在 10 秒内运行。如果大小达到 GB 范围,您可以通过在支持流式传输的 XSLT 3.0 处理器下运行它来减少内存需求。对于简单的流式传输,我通常使用每 GB 1 分钟的首次估计,但有时会快得多。

© www.soinside.com 2019 - 2024. All rights reserved.