User Tools

Site Tools


crear_una_base_marc_con_registros_de_lc

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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}}
crear_una_base_marc_con_registros_de_lc.txt · Last modified: 05/05/2009 00:00 (external edit)