我正在 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 中创建最多六个文件,但是,该文件夹仍然为空,并且该过程尚未成功。
嗯,我不知道它是否是最快的,但应该很容易超过 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 分钟的首次估计,但有时会快得多。