This shows you the differences between two versions of the page.
Next revision | Previous revision Next revision Both sides next revision | ||
crear_una_base_marc_con_registros_de_lc [09/10/2006 16:43] fernando creado |
crear_una_base_marc_con_registros_de_lc [30/04/2009 18:26] fernando |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 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 [[http://catalog.loc.gov/help/lcknownprob.htm|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 [[http://catalog.loc.gov|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|m2i.bat]], [[#lc2i.bat|lc2i.bat]], [[#mrc2isis.php|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 === | ||
+ | |||
+ | <code dos> | ||
+ | @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 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | === m2i.bat === | ||
+ | |||
+ | <code dos> | ||
+ | @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 | ||
+ | </code> | ||
+ | |||
+ | === m2i.syn === | ||
+ | <code dos> | ||
+ | ------------------------------------------------------------- | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | === mrc2isis.php === | ||
+ | <code 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"; | ||
+ | } | ||
+ | ?> | ||
+ | </code> | ||
+ | |||
+ | |||
+ | {{tag>marc}} |