NAME
Catmandu::Fix::marc_cut - cut marc data in a structured way to a new field
SYNOPSIS
# Cut the 001 field out of the MARC record into the fixed001
marc_cut(001, fixed001)
# Cut all 650 fields out of the MARC record into the subjects array
marc_cut(650, subjects)
DESCRIPTION
This Fix work like Catmandu::Fix::marc_copy except it will also remove all mathincg fields from the MARC record
METHODS
marc_cut(MARC_PATH, JSON_PATH, [equals: REGEX])
Cut this MARC fields referred by a MARC_PATH to a JSON_PATH. hen an equals
value has been provided, then only the MARC_PATHs with a value equal to equals
will be cut 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
.
# cut only the 100 fields which have a $a subfield
marc_cut(100a,tmp)
# cut only the 100 fields with have a $a subfield matching 'My'
marc_cut(100a,tmp,equals:
"My"
)
# cut only the 100 fields with have a concatinated string value 'MyField.'
# (equals is an regex, the period "." needs to be escaped "\.")
marc_cut(100,tmp,equals:
"MyField\."
)
# cut only the 100 fields which have a "." at the end
marc_cut(100,tmp,equals:
"\.$"
)
More examples:
# Cut all the 300 fields
marc_cut(300,tmp)
# Cut all the 300 fields with indicator 1 = 1
marc_cut(300[1],tmp)
# Cut all the 300 fields which have subfield c
marc_cut(300c,tmp)
# Cut all the 300 fields which have subfield c equal to 'ABC'
marc_cut(300c,tmp,equals:
"^ABC"
)
The JSON_PATH tmp
will contain an array with one item per field that was cut. Each item is a hash containing the following fields:
tmp.*.tag - The names of the MARC field
tmp.*.ind1 - The value of the first indicator
tmp.*.ind2 - The value of the second indicator
tmp.*.subfields - An array of subfield items. Each subfield item is a
hash of the subfield code and subfield value
E.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 fields
do
marc_each(var:this)
if
all_match(this.tag,300)
# Set the first indicator to 1
set_field(this.ind1,1)
marc_paste(this)
end
end
# Capitalize all the v subfields of 300
do
marc_each(var:this)
if
all_match(this.tag,300)
do
list(path:this.subfields, var:loop)
if
(
exists
(loop.v))
upcase(loop.v)
end
end
marc_paste(this)
end
end
INLINE
This Fix can be used inline in a Perl script:
my
$data
= {
record
=> [
'650'
,
' '
, 0,
'a'
,
'Perl'
] };
$data
= marc_cut(
$data
,
'650'
,
'subject'
);
$data
->{subject}->[0]->{tag} ,
"\n"
;
# '650'
$data
->{subject}->[0]->{ind1} ,
"\n"
;
# ' '
$data
->{subject}->[0]->{ind2} ,
"\n"
;
# 0
$data
->{subject}->[0]->{subfields}->[0]->{a} ,
"\n"
;
# 'Perl'
SEE ALSO
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.