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

标签 xml perl csv xml-parsing xml-twig

我有一个巨大的 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 block ,但第二个客户有 2 个,而且它在 auc 中还有一个额外的标签,即 extraBit。现在的问题是:

  1. 我应该一次处理一名客户(从一名客户到/customer,等等),因为一次 10 Gb 会使系统崩溃。

  2. 我尝试在循环中使用 XML TWIG,当我尝试为客户 1 使用 extraBit 时,它会因“未定义值”而终止程序:

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

    无法对 xml-tags.pl 第 50 行的未定义值调用方法“text”。

  3. 对于客户的额外 auc 值,我希望它们在 CSV 文件中输出为:

    客户 ID、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/

相关文章:

xml - 根据 XSLT 中的条件增加值

android - getString 返回错误的语言字符串

perl - 多客户端全双工 Perl 套接字

java - 在Java中将CSV文件读入数组[不兼容的类型: Integer cannot be converted to int[].]

java - 使用 Transformer 缩进 XML 内部数据

perl - 如何在 Perl 中找到从包继承的所有包?

perl - 对两个参数进行排序哈希

对于 D3.js 图表,Javascript map 不会返回数组值

python - Pandas DataFrame 的起始索引为 1

java - 在Android Studio中渲染xml文件