Guest User

Untitled

a guest
Jul 20th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.78 KB | None | 0 0
  1.  
  2. #paramètres de order_cleanrecord
  3. my $orderfields=0;
  4. my $ordersubfields=0;
  5. my $cleannsb=1;
  6. my $delemptysubfields=0;
  7. $record=order_cleanrecord($orderfields, $ordersubfields, $cleannsb, $delemptysubfields, $record);
  8. sub order_cleanrecord {
  9.     my ($orderfields, $ordersubfields, $cleannsb, $delemptysubfields, $in_record) = @_;
  10.     #$orderfields : bool to defined if we want to order fields
  11.     #$ordersubfields : bool to defined if we want to order subfields
  12.     #$cleannsb : bool to defined if we want to clean Non Sorting Block for each fields and subfields
  13.     #$delemptysubfields : bool to defined if we want to delete empty subfields
  14.     #$in_record : the Marc reacord paramater
  15.     my $out_record=MARC::Record->new;
  16.     $out_record->leader($in_record->leader);
  17.     my @order = qw/0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z/;
  18.     my %tag_names;
  19.     if($orderfields)
  20.     {
  21.         %tag_names = map( { $$_{_tag} => 1 } $in_record->fields); #eq. my @ordre;foreach my $field ( $in_record->fields ) { push (@ordre, $$field{"_tag"}) } \nmy %tag_names;foreach(@ordre){$tag_names{$_} = 1;}
  22.     }
  23.     else
  24.     {
  25.         %tag_names = (1=>1);
  26.     }
  27.     foreach my $tag(sort({ $a <=> $b } keys(%tag_names)))
  28.     {
  29.         my @fields;
  30.         if($orderfields)
  31.         {
  32.             @fields=$in_record->field($tag);
  33.         }
  34.         else
  35.         {
  36.             @fields=$in_record->fields();
  37.         }
  38.         foreach my $field(@fields)
  39.         {
  40.             my $newfield;
  41.             if ($field->is_control_field())
  42.             {
  43.                 $field->update(nsbclean($field->data())) if $cleannsb;
  44.                 next if $delemptysubfields and !defnonull($field->data());
  45.                 $out_record->append_fields($field);
  46.             }
  47.             else
  48.             {
  49.                 my @subfields;
  50.                 if($ordersubfields)
  51.                 {
  52.                     foreach my $key (@order)
  53.                     {
  54.                         foreach my $subfield ($field->subfield($key))
  55.                         {
  56.                             $subfield=nsbclean($subfield) if $cleannsb;
  57.                             next if $delemptysubfields and !defnonull($subfield);
  58.                             push @subfields, $key, $subfield;
  59.                         }
  60.                     }
  61.                 }
  62.                 else
  63.                 {
  64.                     foreach my $subfield ($field->subfields())
  65.                     {
  66.                         $subfield->[1]=nsbclean($subfield->[1]) if $cleannsb;
  67.                         next if $delemptysubfields and !defnonull($subfield->[1]);
  68.                         push @subfields, $subfield->[0], $subfield->[1];
  69.                     }
  70.                 }
  71.                 if (scalar(@subfields) > 0)
  72.                 {
  73.                     eval { $newfield = MARC::Field->new($field->tag(), $field->indicator(1), $field->indicator(2), @subfields); };
  74.                     if ($@)
  75.                     {
  76.                         warn "error : $@";
  77.                     }
  78.                     else
  79.                     {
  80.                         $out_record->append_fields($newfield);
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     return $out_record;
  87. }
  88.  
  89. sub nsbclean {
  90.     my ($string) = @_ ;
  91.     $_ = $string ;
  92.     s/\x88//g ;# NSB : begin Non Sorting Block
  93.     s/\x89//g ;# NSE : Non Sorting Block end
  94.     s/\x98//g ;# NSB : begin Non Sorting Block
  95.     s/\x9C//g ;# NSE : Non Sorting Block end
  96.     s/\xC2//g ;# What is this char ? It is sometimes left by the regexp after removing NSB / NSE
  97.     $string = $_ ;
  98.     return($string) ;
  99. }
  100.  
  101. sub defnonull { my $var = shift; if (defined $var and $var ne "") { return 1; } else { return 0; } }
Add Comment
Please, Sign In to add comment