---
name: "Catmandu::Fix::marc_map"
section: "3pm"
platform: "linux"
package: "libcatmandu-marc-perl"
version: "1.320-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Catmandu::Fix::marc_map"
---

# Catmandu::Fix::marc\_map(3pm)

copy marc values of one field to a new field

## NAME

Catmandu::Fix::marc\_map - copy marc values of one field to a new field

## SYNOPSIS

```
    # Append all 245 subfields to my.title field the values are joined into one string
    marc_map('245','my.title')
    # Append al 245 subfields to the my.title keeping all subfields as an array
    marc_map('245','my.title', split:1)
    # Copy the 245-$a$b$c subfields into the my.title hash in the order provided in the record
    marc_map('245abc','my.title')
    # Copy the 245-$c$b$a subfields into the my.title hash in the order c,b,a
    marc_map('245cba','my.title', pluck:1)
    # Add the 100 subfields into the my.authors array
    marc_map('100','my.authors.$append')
    # Add the 710 subfields into the my.authors array
    marc_map('710','my.authors.$append')
    # Add the 600-$x subfields into the my.subjects array while packing each into a genre.text hash
    marc_map('600x','my.subjects.$append.genre.text')
    # Copy the 008 characters 35-37 into the my.language hash
    marc_map('008/35-37','my.language')
    # Copy all the 600 fields into a my.stringy hash joining them by '; '
    marc_map('600','my.stringy', join:'; ')
    # When 024 field exists create the my.has024 hash with value 'found'
    marc_map('024','my.has024', value:found)
    # When 260c field exists create the my.has260c hash with value 'found'
    marc_map('260c','my.has260c', value:found)
    # Copy all 100 subfields except the digits to the 'author' field
    marc_map('100^0-9','author')
    # Map all the 500 - 599 fields to my.notes
    marc_map('5..','my.motes')
    # Map the 100-a field where indicator-1 is 3
    marc_map('100[3]a','name.family')
    # Map the 245-a field where indicator-2 is 0
    marc_map('245[,0]a','title')
    # Map the 245-a field where indicator-1 is 1 and indicator-2 is 0
    marc_map('245[1,0]a','title')
```

## DESCRIPTION

Copy data from a MARC field to JSON path.

This module implements a small subset of the MARCspec \<http://marcspec.github.io/MARCspec/\> specification to map MARC fields. For a more extensive MARC path implementation please take a look at Casten Klee's MARCSpec module: Catmandu::Fix::marc\_spec

## METHODS

### marc\_map(MARC\_PATH, JSON\_PATH, OPT:VAL, OPT2:VAL,...)

Copy the value(s) of the data found at a MARC\_PATH to a JSON\_PATH.

The MARC\_PATH can point to a MARC field. For instance:

```
    marc_map('245',title)
    marc_map('020',isbn)
```

The MARC\_PATH can point to one or more MARC subfields. For instamce:

```
    marc_map('245a',title)
    marc_map('245ac',title)
```

You can also use dollar signs to indicate subfields

```
    marc_map('245$a$c',title)
```

Wildcards are allowed in the field names:

```
    # Map all the 200-fields to a title
    marc_map('2..'',title)
```

To filter out specific fields indicators can be used:

```
    # Only map the MARC fields with indicator-1 is '1' to title
    marc_map('245[1,]',title)
```

Also a substring of a field value can be mapped:

```
    # Map 008 position 35 to 37 to the language field
    marc_map('008/35-37',language)
```

By default all matched fields in a MARC\_PATH will be joined into one string. This behavior can be changed using one more more options (see below).

Visit our Wiki \<https://github.com/LibreCat/Catmandu-MARC/wiki/Mapping-rules\> for a complete overview of all allowed mappings.

## OPTIONS

### split: 0\|1

When split is set to 1 then all mapped values will be joined into an array instead of a string.

```
    # The subject field will contain an array of strings (one string
    # for each 500 field found)
    marc_map('500',subject, split: 1)
    # The subject field will contain a string
    marc_map('500', subject)
```

### join: Str

By default all the values are joined into a string without a field separator. Use the join function to set the separator.

```
    # All subfields of the 245 field will be separated with a space " "
    marc_map('245',title, join: " ")
```

### pluck: 0\|1

Be default, all subfields are added to the mapping in the order they are found in the record. Using the pluck option, one can select the required order of subfields to map.

```
    # First write the subfield-c to the title, then the subfield_a
    marc_map('245ca',title, pluck:1)
```

### value: Str

Don't write the value of the MARC (sub)field to the JSON\_PATH but the specified string value.

```
    # has_024_a will contain the value 'Y' if the MARC field 024 subfield-a
    # exists
    marc_map('024a',has_024_a,value:Y)
```

### nested\_arrays: 0\|1

When the split option is specified the output of the mapping will always be an array of strings (one string for each subfield found). Using the nested\_array option the output will be an array of array of strings (one array item for each matched field, one array of strings for each matched subfield).

## INLINE

This Fix can be used inline in a Perl script:

```
    use Catmandu::Fix::marc_map as => 'marc_map';
    my $data = { record => [...] };
    $data = marc_map($data,'245a','title');
    print $data->{title} , "\n";
```

## SEE ALSO

Catmandu::Fix Catmandu::Fix::marc\_spec
