Table of Contents

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

Pasos

  1. Ingresar al catálogo de LC.
  2. 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)
  3. Seleccionar un número elevado de resultados por página (explicar problemas)
  4. Ejecutar la búsqueda, y reformularla en caso de que los registros recuperados no se ajusten a las expectativas.
  5. Para cada página de resultados, repetir estos pasos (incluir imagen):
  6. Elegir “All (this page)”
  7. Elegir “MARC”
  8. Presionar el botón “…”
  9. Una vez recibida la página con los registros MARC (imagen aquí), hay que grabarla en el disco:
    1. Ver > Código fuente
    2. Archivo > Guardar como…
    3. Nombre del archivo:
  10. Alternativamente, se puede usar este otro método:
    1. Edición > Seleccionar todo
    2. Edición > Copiar
    3. Pegar el contenido en un archivo de texto
  11. Mediante el botón Atrás (Back), regresar a la página de resultados, y avanzar a la siguiente (imagen).
  12. Si los registros MARC fueron guardados en archivos separados, es necesario juntarlos en un único archivo:

Generación de la base ISIS

Herramientas necesarias

Pasos

  1. 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:

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";
  }
  ?>