====== Importación en Catalis de bases de IsisMarc ======
//Ver también: [[notas:importacion_batch]]//
{{notas:isismarc.zip|Registros de muestra exportados desde IsisMarc}}
{{notas:lc.zip|Registros de muestra exportados desde el OPAC de LC}}
Para que Catalis pueda tomar datos generados por IsisMarc, podemos trabajar directamente a nivel de bases Isis, o mejor aun podemos limitarnos a trabajar con la importación de registros MARC, ya que IsisMarc puede exportar en formato MARC.
La importación de registros MARC a una base Isis es muy simple pues a partir de la versión 5.2 MX puede leer registros MARC en forma directa:
mx iso=marc=registros.mrc isotag1=900 create=registros now -all
Con ''isotag1'' indicamos en qué campos de la base Isis se almacenarán los datos de la cabecera del registro MARC, e.g. ''isotag1=900'' significa que se usarán los campos 905, 906, etc (como hace Catalis).
Los problemas a tener en cuenta son:
* Codificación de caracteres
* Sustitución del carácter utilizado como delimitador de subcampos (hex 1F, asc 31) por ''^''.
* Modificación del campo 001
* Campos locales 9xx: ¿cómo tratarlos?
===== Codificación de caracteres =====
IsisMarc permite elegir dos tipos de codificaciones al exportar: el default es **latin1** (aunque no utiliza explícitamente ese nombre), y está la opción de usar "**diacríticos ALA**", que posiblemente significa MARC-8.
Si importamos registros MARC de LC u otras fuentes, deberíamos también tener en cuenta la posibilidad de que éstos vengan con la codificación **UTF-8**. A su vez, dentro de UTF-8 podemos tener 2 variantes según como se representen los diacríticos: //combining diacritics// y //precomposed characters//, ver [[http://en.wikipedia.org/wiki/Combining_character|Combining character en Wikipedia]]. LC utiliza la segunda opción.
En Catalis estamos restringidos a trabajar con latin1, por lo tanto necesitamos mapeos desde las codificaciones mencionadas arriba hacia latin1. Para esto podemos utilizar iconv o [[http://www.gnu.org/software/libiconv/|libiconv]]. Sin embargo, parece que esta herramienta no reconoce la codificación que utiliza //combining diacritics//. Otras herramientas para estudiar: enca/enconv, unidesc, yaz-iconv.
¿Cómo podemos saber cuál es la codificación del archivo .mrc que queremos importar?
===== Delimitador de subcampos =====
Para convertir el carácter hex 1F en ''^'' podemos utilizar un gizmo con un único registro.
===== Sustitución de blancos =====
Catalis utiliza el carácter ''#'' para representar los blancos en campos de control (001 al 009), 010, indicadores y cabecera.
===== Modificación del campo 001 =====
Un requerimiento básico es que el valor del campo 001 en los registros importados no entre en conflicto con los ya existentes en la base de Catalis (si los hubiera).
Alternativas:
- asignar nuevos números de control, y eliminar el número de control original de los registros
- asignar nuevos números de control, y preservar en algún campo el número de control original de los registros
- mantener el número de control original de los registros: esto requiere verificar que no se produzcan conflictos.
La más sencilla es la opción 1.
===== Existencias =====
Aparentemente IsisMarc no incluye administración de existencias.
===== Script =====
# ==========================================================================
# Script para importar registros MARC 21 en Catalis
#
# Dos casos particulares que nos interesan:
# - registros de IsisMarc (latin1 / "diacríticos ala")
# - registros de LC (marc-8 / utf-8)
#
# uso:
# import
#
# ejemplo:
# import registros.mrc biblio
#
# Validaciones: existencia del archivo y de la base
# Hay que considerar la opción de que la base no exista y sea creada a
# partir del archivo mrc?
# Incluir un undo?
# ==========================================================================
# a partir de qué tag se almacenan los datos del leader
LEADER_BASE_TAG_1=1000 # provisorio
LEADER_BASE_TAG_2=900 # definitivo
# archivo de registros MARC
MARC_FILE=$1
# base donde almacenar los registros importados
TARGET_DB=$2 || 'biblio'
# archivo usado como contador para generar el campo 001
COUNTER='cn.txt'
# dónde encontrar mx
PATH=~/campi/cisis-5.2:$PATH
export PATH
#echo $PATH
# tenemos que asegurarnos de estar usando mx 5.x (al menos)
mx what > mxversion
mx seq=mxversion count=1 "pft=if v1 : 'CISIS Interface v5.' then 'OK' fi" now > versionOK
# TO-DO: exit con mensaje de error si mx es viejo
clear
# creamos una base isis a partir del registro MARC
# BUG: la posición 09 del leader no se almacena!! (informar a Spinak/Bireme)
mx iso=marc=$MARC_FILE isotag1=$LEADER_BASE_TAG_1 create=basemarc now -all
# eliminamos del registro importado algunos campos locales que utiliza Catalis
# TO-DO: esta lista es completa?
mx basemarc "proc='d905 d906 d907 d908 d909 d917 d918 d919'" copy=basemarc now -all
# traemos los datos del leader a los campos 9xx
mx basemarc "proc='d1005d1006d1007d1008d1009d1017d1018d1019','a905|',v1005,'|a906|',v1006,'|a907|',v1007,'|a908|',v1008,'|a909|',v1009,'|a917|',v1017,'|a918|',v1018,'|a919|',v1019,'|'" copy=basemarc now -all
# sustituir delimitadores de subcampos: hex 1F => ^
mx basemarc gizmo=delimsubcampo copy=basemarc now -all
# cambiamos la codificación, si la original no es latin1
# TO-DO: cómo averiguamos cuál es la codificación original de los registros?
# TO-DO: usamos un gizmo? cómo nos aseguramos de estar usando el gizmo correcto?
#mx basemarc gizmo=ansel2latin1 copy=basemarc now -all
# sustitución de blancos en campos de datos
mx basemarc "proc=@blancos.pft" copy=basemarc now -all
# sustitución de blancos en indicadores
i2id basemarc > basemarc.id
mx seq=basemarc.id create=basemarc-campos now -all # OJO: que no separe en campos accidentalmente
mx basemarc-campos "proc='d1a1|',v1.6,replace(v1*6.2,' ','#'),v1*8,'|'" copy=basemarc-campos now -all
mx basemarc-campos lw=2000 "pft=v1/" now > basemarc-campos.id
id2i basemarc-campos.id create=basemarc-catalis
# ajuste del campo 001 (REVISAR rellenado con ceros)
mx basemarc-catalis "proc='d001a001|',right(s('000000',f(mfn + val(cat('$COUNTER')),1,0)),6),'|'" copy=basemarc-catalis now -all
# actualización del contador
mx basemarc-catalis "pft=right(s('000000',f(maxmfn + val(cat('$COUNTER')) - 1,1,0)),6)" count=1 now > $COUNTER
# agregamos los registros a la base destino
mx basemarc-catalis append=$TARGET_DB now -all
# TO-DO: generar (o actualizar) el archivo invertido
'd001 d006 d007 d008 d010',
'd905 d906 d907 d908 d917 d918 d919',
/* sustitución de blancos en campos de datos */
'a001|',replace(v001,' ','#'),'|',
if p(v006) then
( 'a006|',replace(v006,' ','#'),'|', ),
fi,
if p(v007) then
( 'a007|',replace(v007,' ','#'),'|', ),
fi,
'a008|',replace(v008,' ','#'),'|',
if p(v010) then
'a010|',replace(v010,' ','#'),'|',
fi,
/* sustitución de blancos en datos de la cabecera */
'a905|',replace(v905,' ','#'),'|',
'a906|',replace(v906,' ','#'),'|',
'a907|',replace(v907,' ','#'),'|',
'a908|',replace(v908,' ','#'),'|',
'a909|',replace(v909,' ','#'),'|', /* ATENCION: viene vacío en registros de IsisMarc */
'a917|',replace(v917,' ','#'),'|',
'a918|',replace(v918,' ','#'),'|',
'a919|',replace(v919,' ','#'),'|',
{{tag>catalis isismarc importacion}}