This shows you the differences between two versions of the page.
crear_una_base_marc_con_registros_de_lc [26/06/2007 18:19] 127.0.0.1 editor externo |
crear_una_base_marc_con_registros_de_lc [05/05/2009 00:00] |
||
---|---|---|---|
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> |