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).
.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:
@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
@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.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
<?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"; } ?>