Как я могу удалить дублирующую информацию с помощью Perl? - PullRequest
0 голосов
/ 24 ноября 2011

извините, что спрашиваю снова и снова, потому что не хватает знаний в Perl, и я новичок в языке программирования. Моя настоящая проблема заключается в том, что я извлекаю некоторые узлы из нескольких файлов и сохраняю их в строке, и в этой строке у меня есть несколько повторяющихся строк, поэтому мне нужно удалить повторяющиеся строки. поэтому я попытался после вашего предложения, как это.

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
use Carp;
  use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;

my @ARGV ="c:/main/work";die "Need directories\n" unless @ARGV;
my $all="<DTCSpecification xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
  find(
       sub {
    return unless ( /(_tr\.xml)$/ and -f );
    extract_information();
    return;
    },
  @ARGV
  );
 my $elem;
 sub extract_information {
    my $path = $_;

  if ( my $reader = XML::LibXML::Reader->new( location => $path )) {

         while ( $reader->nextElement( 'university' )) {
                  $elem = $reader->readOuterXml();
         $all=$all.$elem;
        }
   }
    return;
    }
  my $so="</DTCSpecification>";
  $all= $all.$so;

  my $doc = XML::LibXML->load_xml( string=>$all);
  my %seen;
    foreach my $uni ( $doc->findnodes('//university') ) 

     my $name = $uni->find('Code');

    print "'$name' duplicated\n",
    $uni->unbindNode() if $seen{$name}++;  # Remove if seen before
     }
   $all = $all.$doc->toString;
    print $all;

это печать два раза первый раз с повторной информацией и второй раз без повторения. Я так старался, но не могу понять, почему его печатали два раза. Как устранить печать с повторяющейся информацией. а также он удаляет узлы в соответствии с элементом «код», поэтому его удаляет узел, когда элемент кода встречается во второй раз, но иногда я получаю полезную информацию во втором, а не при первом появлении. Как мне это преодолеть. не могли бы вы помочь мне. Мне очень очень жаль спрашивать снова и снова и тратить ваше драгоценное время. Это моя скромная просьба.

1 Ответ

6 голосов
/ 24 ноября 2011

Непонятно, зачем здесь нужен XML::LibXML::Reader. Возможно, немного больше информации поможет в этом отношении.

Вот как бы я это сделал:

use strict;
use warnings;
use XML::LibXML;

my $file = 'universities.xml';
my $doc = XML::LibXML->load_xml( location => $file );

my %seen;
foreach my $uni ( $doc->findnodes('//university') ) {  # 'university' nodes only

    my $name = $uni->find('name');

    print "'$name' duplicated\n",
      $uni->unbindNode() if $seen{$name}++;  # Remove if seen before
}

$doc->toFile('universities.xml'); # Print to file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...