Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #paramètres de order_cleanrecord
- my $orderfields=0;
- my $ordersubfields=0;
- my $cleannsb=1;
- my $delemptysubfields=0;
- $record=order_cleanrecord($orderfields, $ordersubfields, $cleannsb, $delemptysubfields, $record);
- sub order_cleanrecord {
- my ($orderfields, $ordersubfields, $cleannsb, $delemptysubfields, $in_record) = @_;
- #$orderfields : bool to defined if we want to order fields
- #$ordersubfields : bool to defined if we want to order subfields
- #$cleannsb : bool to defined if we want to clean Non Sorting Block for each fields and subfields
- #$delemptysubfields : bool to defined if we want to delete empty subfields
- #$in_record : the Marc reacord paramater
- my $out_record=MARC::Record->new;
- $out_record->leader($in_record->leader);
- 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/;
- my %tag_names;
- if($orderfields)
- {
- %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;}
- }
- else
- {
- %tag_names = (1=>1);
- }
- foreach my $tag(sort({ $a <=> $b } keys(%tag_names)))
- {
- my @fields;
- if($orderfields)
- {
- @fields=$in_record->field($tag);
- }
- else
- {
- @fields=$in_record->fields();
- }
- foreach my $field(@fields)
- {
- my $newfield;
- if ($field->is_control_field())
- {
- $field->update(nsbclean($field->data())) if $cleannsb;
- next if $delemptysubfields and !defnonull($field->data());
- $out_record->append_fields($field);
- }
- else
- {
- my @subfields;
- if($ordersubfields)
- {
- foreach my $key (@order)
- {
- foreach my $subfield ($field->subfield($key))
- {
- $subfield=nsbclean($subfield) if $cleannsb;
- next if $delemptysubfields and !defnonull($subfield);
- push @subfields, $key, $subfield;
- }
- }
- }
- else
- {
- foreach my $subfield ($field->subfields())
- {
- $subfield->[1]=nsbclean($subfield->[1]) if $cleannsb;
- next if $delemptysubfields and !defnonull($subfield->[1]);
- push @subfields, $subfield->[0], $subfield->[1];
- }
- }
- if (scalar(@subfields) > 0)
- {
- eval { $newfield = MARC::Field->new($field->tag(), $field->indicator(1), $field->indicator(2), @subfields); };
- if ($@)
- {
- warn "error : $@";
- }
- else
- {
- $out_record->append_fields($newfield);
- }
- }
- }
- }
- }
- return $out_record;
- }
- sub nsbclean {
- my ($string) = @_ ;
- $_ = $string ;
- s/\x88//g ;# NSB : begin Non Sorting Block
- s/\x89//g ;# NSE : Non Sorting Block end
- s/\x98//g ;# NSB : begin Non Sorting Block
- s/\x9C//g ;# NSE : Non Sorting Block end
- s/\xC2//g ;# What is this char ? It is sometimes left by the regexp after removing NSB / NSE
- $string = $_ ;
- return($string) ;
- }
- sub defnonull { my $var = shift; if (defined $var and $var ne "") { return 1; } else { return 0; } }
Add Comment
Please, Sign In to add comment