gpt4 book ai didi

xml - Perl XML::Twig。巨大的文件处理。如何处理重复的条目和不存在的条目

转载 作者:行者123 更新时间:2023-12-04 05:09:15 27 4
gpt4 key购买 nike

我有一个巨大的 XML 文件(大约 10 Gb),我需要将其转换为 CSV。现在,该文件将包含有关众多客户的信息。我必须将其转换为 CSV 格式。问题是许多客户会有其他客户不会的额外字段,并且某些字段会重复。 XML的例子是:

<customer>
<customerID>1</customerID>
<auc>
<algoId>0</algoId>
<kdbId>1</kdbId>
<acsub>1</acsub>
</auc>
</customer>

<customer>
<customerID>2</customerID>
<auc>
<algoId>0</algoId>
<kdbId>1</kdbId>
<acsub>1</acsub>
<extraBit>12345</extraBit>
</auc>
<auc>
<algoId>2</algoId>
<kdbId>3</kdbId>
<acsub>3</acsub>
<extraBit>67890</extraBit>
</auc>
<customOptions>
<odboc>0</odboc>
<odbic>0</odbic>
<odbr>1</odbr>
<odboprc>0</odboprc>
<odbssm>0</odbssm>
</customOptions>
</customer>

现在你可以看到第一个客户只有 1 个 auc 块,但第二个有 2 个,而且它在 auc 中还有一个额外的标签,即 extraBit。现在的问题:
  • 我应该一次处理一位客户(从一位客户到/customer,然后依此类推),因为 10 Gb atonce 会使系统崩溃。
  • 我尝试在循环中使用 XML TWIG,当我尝试为客户 1 使用 extraBit 时,它会因“未定义值”而终止程序:

    打印 $customer->first_child('extraBit')->text()

    无法在 xml-tags.pl 第 50 行的未定义值上调用方法“text”。
  • 对于客户的额外 auc 值,我希望它们在 CSV 文件中输出为:

    customerID,algoId,kdbId,acsub,extraBit,algoId2,kdbId2,acsub2,extraBit2

    1,0,1,1,,,,,,,

    2,0,1,1,1234,2,3,3,67890
  • 最佳答案

    print $customer->first_child('extraBit')->text()

    您可以使用 first_child_text 避免未定义错误相反,如果找不到匹配的子元素,它被定义为返回一个空字符串。
    print $customer->first_child_text('extraBit')

    完整的代码将类似于
    my $t= XML::Twig->new(
    twig_handlers => { customer => \&process_customer });
    $t->parsefile('file.xml');

    sub process_customer {
    my ($t, $customer) = @_;
    print $customer->first_child_text('customerID');
    foreach my $auc ($customer->children('auc')) {
    print ',', $auc->first_child_text('algoId'),
    ',', $auc->first_child_text('kdbId'),
    ',', $auc->first_child_text('acsub'),
    ',', $auc->first_child_text('extraBit');
    }
    print "\n"
    $customer->purge;
    }

    关于xml - Perl XML::Twig。巨大的文件处理。如何处理重复的条目和不存在的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091933/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com