Re: Removing duplicate fields with MARC::record

[email protected] ("Mike Rylander")
Newsgroups perl.perl4lib
Message-ID <[email protected]>
MUST ... RESIST ... URGE ... FOR ... ONEUPMANSHIP!!!

AAAAAAAAAAAHHHHHHHHHGGGGGGGG!!!!!!!  ;)

...

while (my $record = $batch->next) {
  # find 'em
  my @m856 = $record->field('856');

  # get rid of 'em
  $record->delete_field( $_ ) for @m856;

  # map to a hash for direct uniqueness
  %u856 = (map { ($_->as_usmarc => $_) } @m856);

  # then add 'em back
  $record->insert_fields_ordered( values( %u56) );
}



# sorry for the top-posting... and it's untested :)
__END__

--miker


On 7/30/07, Bryan Baldus <[email protected]> wrote:
> Note: my comments are untested and may not work without modification. Some
> parts left to the reader to complete.
>
> On Monday, July 30, 2007 2:16 PM, Michael Bowden wrote:
> >   @m856 = sort {$a cmp $b} @m856;
>
> @m856 has MARC::Field objects. Comparing them as such are unlikely to
> produce desired results.
> better might be @m856 = sort {$a->as_usmarc() cmp $b->as_usmarc()} @m856,
> but then you lose the field object. Better might be to leave out that step
> and go on to:
>
> >   my %seen = ();
> >   my @new856 = ();
>
> Instead of going through all fields in the record, you could go through the
> 856s you have gathered, add them to the %seen hash as usmarc (to facilitate
> comparisons), and, as subsequent ones are already seen, delete the field.
> After that, you could sort the fields, delete them, and then add back the
> sorted fields.
>
>       if (@m856) {
>          foreach $f (@m856) {
>    #add this field to seen fields if not seen
>    unless ($seen{$f->as_usmarc}){
>       $seen{$f->as_usmarc} = $f;
>    }#unless seen this field's exact data
>    else {
>       #seen it, so delete current
>              $record->delete_field($f);
>    } #else seen this field
>  } #foreach 856
>
> my @new856 = (); #add values of %seen, sorted according to keys of %seen
> ###sort remaining/deduplicated 856 fields, delete existing fields, and then
> add sorted fields back.
> ###where @new856 contains the values of %seen, sorted according to the keys
> of %seen
>
>    $record->insert_fields_ordered( @new856 );
>
> #########################################
>
> I hope this helps,
>
> Bryan Baldus
> [email protected]
> [email protected]
> http://home.inwave.com/eija
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.