0

約 15 万レコードの XML ファイルがあります。レコードのフォーマットを以下に示します。

<product>
<product_id>1</product_id>
<product_name>ABC1</product_name>
</product>
<product>
<product_id>2</product_id>
<product_name>ABC2</product_name>
</product>
<product>
<product_id>3</product_id>
<product_name>ABC3</product_name>
</product>
<product>
<product_id>3</product_id>
<product_name>ABC4</product_name>
</product>
<product>
<product_id>4</product_id>
<product_name>ABC5</product_name>
</product>
<product>
<product_id>5</product_id>
<product_name>ABC6</product_name>
</product>
<product>
<product_id>6</product_id>
<product_name>ABC7</product_name>
</product>

上記のファイルをロードすると、一意の制約違反エラーが発生します。これは、一部のレコードが、データベースが許可しない同じ product_id を使用していることを意味します。

VI でファイルを解析して、一意ではない ID (product_id タグを使用) を使用しているすべての製品を認識/表示する簡単な方法はありますか。例として、上記のサンプルには、同じ固有 ID 3 を使用する 2 つの製品があります。

4

2 に答える 2

1

Nadav の提案に基づいていますが、パーサーが異なります。ここでは、 とそのXML::Twigモジュールを使用するアプローチです。コンマで区切られたすべての繰り返されるIDを出力します。

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

my (@rep_ids, %id);

XML::Twig->new(
    twig_roots => {
        'product/product_id' => sub {
            my $id = $_->text_only;
            if ( exists $id{ $id } ) { 
                push @rep_ids, $id;
            }   
            $id{ $id } = 1;
        },  
    },  
)->parsefile( shift );

printf qq|%s\n|, join q|,|, @rep_ids;

次のように実行します。

perl script.pl xmlfile

それは以下をもたらします:

3
于 2013-11-17T21:22:49.670 に答える