NAME
Catmandu::Fix::marc_copy - copy marc data in a structured way to a new field
SYNOPSIS
# Cut the 001 field out of the MARC record into the fixed001marc_copy(001, fixed001)# Cut all 650 fields out of the MARC record into the subjects arraymarc_copy(650, subjects)
DESCRIPTION
Copy MARC data referred by MARC_TAG in a structured way to JSON path.
In contrast to Catmandu::Fix::marc_map and Catmandu::Fix::marc_spec marc_copy will not only copy data content (values) but also all data elements like tag, indicators and subfield codes into a nested data structure.
METHODS
marc_copy(MARC_PATH, JSON_PATH, [equals: REGEX])
Copy this MARC fields referred by a MARC_PATH to a JSON_PATH. When an "equals" value has been provided, then only the MARC_PATHs with a value equal to "equals" will be copied to JSON_PATH. When the MARC_PATH points to a subfield, then the subfield value need to match "equals". When the MARC_PATH points multiple subfields, then a concatinated string value needs to match "equals":
Data:100 $aMy$bField.# copy only the 100 fields which have a $a subfieldmarc_copy(100a,tmp)# copy only the 100 fields with have a $a subfield matching 'My'marc_copy(100a,tmp,equals:"My")# copy only the 100 fields with have a concatinated string value 'MyField.'# (equals is an regex, the period "." needs to be escaped "\.")marc_copy(100,tmp,equals:"MyField\.")# copy only the 100 fields which have a "." at the endmarc_copy(100,tmp,equals:"\.$")
More examples:
# Copy all the 300 fieldsmarc_copy(300,tmp)# Copy all the 300 fields with indicator 1 = 1marc_copy(300[1],tmp)# Copy all the 300 fields which have subfield cmarc_copy(300c,tmp)# Copy all the 300 fields which have subfield c equal to 'ABC'marc_copy(300c,tmp,equals:"^ABC")The JSON_PATH C<tmp> will contain an array with one item per field that was copied.Each item is a hash containing the following fields:tmp.*.tag - The names of the MARC fieldtmp.*.ind1 - The value of the first indicatortmp.*.ind2 - The value of the second indicatortmp.*.subfields - An array of subfield items. Each subfield item is ahash of the subfield code and subfield valueE.g.tmp:- tag: '300'ind1: ' 'ind2: ' 'subfields:- a: 'blabla:'- v: 'test123'- c: 'ok123'These JSON paths can be used like:# Set the first indicator of all 300 fieldsdo marc_each(var:this)if all_match(this.tag,300)# Set the first indicator to 1set_field(this.ind1,1)marc_paste(this)endend# Capitalize all the v subfields of 300do marc_each(var:this)if all_match(this.tag,300)do list(path:this.subfields, var:loop)if (exists(loop.v))upcase(loop.v)endendmarc_paste(this)endend
INLINE
This Fix can be used inline in a Perl script:
use Catmandu::Fix::marc_copy as => 'marc_copy';my $data = { record => ['650', ' ', 0, 'a', 'Perl'] };$data = marc_copy($data,'650','subject');print $data->{subject}->[0]->{tag} , "\n"; # '650'print $data->{subject}->[0]->{ind1} , "\n"; # ' 'print $data->{subject}->[0]->{ind2} , "\n"; # 0print $data->{subject}->[0]->{subfields}->[0]->{a} , "\n"; # 'Perl'
SEE ALSO
- •
-
Catmandu::Fix::marc_cut
- •
-
Catmandu::Fix::marc_paste
LICENSE AND COPYRIGHT
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.