Crear una base MARC con registros de LC

Describiremos aquí un procedimiento para generar una base de datos ISIS en formato MARC, a partir de registros bajados del catálogo de la Library of Congress (LC).

Este procedimiento fue diseñado cuando surgió la necesidad de poder contar con diversas bases de prueba, durante el proceso de desarrollo y testeo de Catalis y OpacMarc. También resultó útil más adelante, cuando algunos bibliotecarios que no contaban con bases MARC propias necesitaron acceder a un demo del OPAC que pudiera resultar atractivo a su comunidad de usuarios.

Las herramientas que se describen fueron desarrolladas y testeadas en Windows; queda pendiente su conversión a Linux (un ejercicio sencillo).

Obtención de los registros

Herramientas necesarias

Navegador web. ATENCION: debido a una falla en el software usado por LC (que se describe en esta página, bajo el título “Problem 7. Unable to save MARC records with newer browser versions”), no nos ha sido posible acceder a registros MARC usando Mozilla y sus derivados (Netscape, Firefox). No ha habido problemas con IE 5.x, IE 6, Opera 7.54.

Pasos

Ingresar al catálogo de LC.

Escribir una expresión de búsqueda que permita recuperar los registros deseados; típicamente uno quiere registros de material sobre un cierto tema, o de uno o varios autores. Atención: es importante restringir la búsqueda por fecha de publicación, debido a los cambios producidos en las reglas de catalogación a lo largo del tiempo. También puede ser útil aplicar restricciones por tipo de material (libros, grabaciones sonoras, etc.), por país de publicación, o por idioma. (incluir imágenes)

Seleccionar un número elevado de resultados por página (explicar problemas)

Ejecutar la búsqueda, y reformularla en caso de que los registros recuperados no se ajusten a las expectativas.

Para cada página de resultados, repetir estos pasos (incluir imagen):

Elegir “All (this page)”

Elegir “MARC”

Presionar el botón “...”

Una vez recibida la página con los registros MARC (imagen aquí), hay que grabarla en el disco:

Ver > Código fuente

Archivo > Guardar como...

Nombre del archivo:

Alternativamente, se puede usar este otro método:

Edición > Seleccionar todo

Edición > Copiar

Pegar el contenido en un archivo de texto

Mediante el botón Atrás (Back), regresar a la página de resultados, y avanzar a la siguiente (imagen).

Si los registros MARC fueron guardados en archivos separados, es necesario juntarlos en un único archivo:

Generación de la base ISIS

Herramientas necesarias

PHP (sólo como utilitario de línea de comandos; no se requiere un servidor web)

Utilitarios CISIS: mx, msrt, id2i

Scripts: m2i.bat, lc2i.bat, mrc2isis.php

Pasos

Ejecutar el script que genera la base ISIS a partir del archivo .mrc. Debemos ejecutarlo en el directorio donde están los restantes scripts (m2i.bat, mrc2isis.php).

lc2i <archivo_mrc> <base_isis>
(mostrar salida generada)

Para verificar que la base ISIS fue creada correctamente, podemos examinarla con mx:

mx <base_isis>
(mostrar salida generada)

Comentarios:

Cómo se mapean los campos del registro ISO 2709 a la base ISIS

Campos que se descartan

Archivos utilizados

lc2i.bat

@echo off ::======================================================================== ::LC2I.BAT :: ::Generación de una base Isis a partir de registros MARC (archivos *.mrc) ::bajados de LC. :: ::Requiere: mx, msrt, m2i.bat :: ::(c) Fernando Gómez, INMABB, abril de 2003 ::======================================================================== if "%1"=="" goto SYNTAX if "%2"=="" goto SYNTAX echo. echo Eliminamos una posible versión anterior de la base mx seq=nul create=%21 now -all echo. echo Llamamos a m2i.bat para cada archivo .mrc que queremos incorporar a la base call m2i.bat %1 %21 echo. echo Eliminamos registros duplicados, en base al campo 001 msrt %21 12 v1 mx %21 "proc=if v1=ref(mfn-1,v1) then 'd*' fi" iso=%2.iso now -all mx iso=%2.iso create=%2 now -all echo. echo Eliminamos algunos campos (ATENCION: tener en cuenta otros más [ver con mxf0]) mx %2 proc='d35d42' copy=%2 now -all echo. echo Actualizamos campos 001 y 005 mx %2 proc='d1a1~',mfn(6),'~' proc='d5a5~',s(date).8,s(date)*9.6,'.0~' proc='s' copy=%2 now -all echo. echo Próximos pasos: generar archivo invertido, aplicar el gizmo, renombrar archivos echo y copiar los archivos al servidor. echo. goto END :SYNTAX echo. echo Uso: lc2i mrc_file isis_db_name echo. echo Ejemplo: lc2i "f:\mrc-files\test1.mrc" "bases\test1" echo. :END

m2i.bat

@echo off ::=========================================================== ::M2I.BAT -- Incorporación de registros MARC en una base ISIS :: ::Requiere: mrc2isis.php, id2i, mx :: ::(c) Fernando Gomez, INMABB, 2003 ::=========================================================== set PHP_DIR=D:\php\cli if "%1"=="" goto SYNTAX if "%2"=="" goto SYNTAX echo. echo Conversión .mrc a .id %PHP_DIR%\php -q mrc2isis.php %1 %2 echo. echo Conversión .id a isis id2i marcfile.id create=%2 tell=100 ::Default: la dejamos como vino (ANSI?) if not "%3"=="oem" goto END echo. echo Conversión ansi a oem set CIPAR=c:\httpd\bases\opacmarc\opac.cip mx %2 gizmo=ANSI2OEM copy=%2 -all now goto END :SYNTAX type %0.syn echo. echo. :END

m2i.syn

------------------------------------------------------------- M2I.BAT ------------------------------------------------------------- Convierte un archivo MARC (.mrc) en una base ISIS m2i <mrc_file> <isis_db> [oem] <mrc_file> Archivo MARC <isis_db> Base ISIS a crear oem Pasar los registros a la codificaci¢n OEM (por defecto, no son modificados, suponiendo que est n en ANSI) Ejemplo: m2i \mrc-files\loc\music.mrc music

mrc2isis.php

<?php // ============================================================================ function mrc2isis($marcRecord,$isisDb) // input: un registro MARC ISO-2709 // output: el mismo registro, aceptable para isis (ignorando campos locales) // // Generamos un unico archivo .txt con el total de los registros, y luego // usamos id2i para crear la base ISIS. // ============================================================================ { $SUBFIELD_DELIMITER = "\x1F"; global $text_file; $leader = substr($marcRecord,0,24); $leader = str_replace(' ','#',$leader); $baseAddress = substr($leader,12,5); $pos = 12; // Loop sobre los elementos del directorio while ($pos+12 < $baseAddress-1) { $pos += 12; $directoryEntry = substr($marcRecord,$pos,12); $tag = substr($directoryEntry,0,3); // Ignoramos los campos locales de LC (9xx, 59x, 012, 09x, 850, 890) if ( substr($tag,0,1) == '9' || substr($tag,0,2) == '59' || $tag == '012') continue; // Extraemos el contenido del campo (indicadores + subcampos) $fieldLength = substr($directoryEntry,3,4); $startPos = substr($directoryEntry,7,5); $fieldContent = substr($marcRecord, $baseAddress + $startPos, $fieldLength - 1); // Reemplazamos ' ' por '#' en campos de control y en algunos campos de datos if ( '00' == substr($tag,0,2) || '010' == $tag || '035' == $tag ) { $fieldContent = str_replace(' ','#',$fieldContent); } // Para los campos de datos, cambiamos ' ' por '#' en los indicadores if ( substr($tag,0,2) != '00' ) { $fieldContent = str_replace(' ','#',substr($fieldContent,0,2)) . substr($fieldContent,2); } // Si el campo contiene algún '^', le anteponemos una barra para no confundirlo luego con un delimitador de subcampo // ATENCION: ¿hay algún otro carácter que debamos modificar? $fieldContent = str_replace('^','\^',$fieldContent); // Y ahora, entra en escena el '^', delimitador de subcampos de ISIS $fieldContent = str_replace($SUBFIELD_DELIMITER,'^',$fieldContent); // Agregamos una línea al archivo .id $textLine = '!v' . $tag . '!' . $fieldContent; fputs ($text_file,$textLine . "\r\n"); } // Datos del leader (no usamos tags > 999 porque se perderían al pasar a un .iso) $textLine = '!v905!' . substr($leader,5,1) . "\r\n"; $textLine .= '!v906!' . substr($leader,6,1) . "\r\n"; $textLine .= '!v907!' . substr($leader,7,1) . "\r\n"; $textLine .= '!v908!' . substr($leader,8,1) . "\r\n"; $textLine .= '!v909!' . substr($leader,9,1) . "\r\n"; $textLine .= '!v917!' . substr($leader,17,1) . "\r\n"; $textLine .= '!v918!' . substr($leader,18,1) . "\r\n"; $textLine .= '!v919!' . substr($leader,19,1) . "\r\n"; fputs ($text_file,$textLine . "\r\n"); } // ==================================================================== // MAIN SECTION // ==================================================================== if ( $argc < 3 || in_array($argv[1], array('--help', '-help', '-h', '-?')) ) { echo "--------------------------------------\n"; echo strtoupper($argv[0])."\n"; echo "--------------------------------------\n"; echo "Uso:\n"; echo " m2i <marc_file> <isis_db> [<max_records>]\n\n"; echo "Tip: para procesar un lote de archivos *.mrc, ejecute primero\n"; echo " copy /b *.mrc allmrc\n\n"; } else { set_time_limit(0); // maximum execution time = unlimited $mrc_file_name = $argv[1]; $isisDb = $argv[2]; $maxCount = $argv[3]; if ( $maxCount == 0 ) $maxCount=1000000; // Archivo de texto para la salida $text_file_name = 'marcfile.id'; unlink($text_file_name); // borramos archivo $text_file = fopen($text_file_name, 'w'); $mrc_file = fopen($mrc_file_name, 'rb'); // b - binary safe echo 'Procesando: ' . $mrc_file_name . "\r\n"; while ( !feof($mrc_file) and $count < $maxCount ) { $recSize = fread($mrc_file,5); if ( $recSize == 0 ) continue; /* Para evitar problemas al final */ $count += 1; if ($count % 10 == 0) { echo '# ' . $count . "\t" . $recSize . "\n"; } $marcRecord = $recSize . fread($mrc_file,$recSize-5); fputs ($text_file, '!ID ' . $count . "\r\n"); // Procesamos el registro mrc2isis($marcRecord,$isisDb); } fclose($mrc_file); fclose($text_file); echo 'Total records: ' . $count . "\n"; } ?>