Print

Print


On Fri, Aug 08, 2014 at 08:46:24PM -0400, Tom Connolly wrote:
> >> Is there an open source way to format the dewey code for printing book
> >> labels? Or can someone tell me how to isolate just the dewey number from a
> >> marc file (I have MarcEdit; is there a better tool for this simple task?)
> >> so it is the only field sent to the printer? (I'm using Ubuntu 14.04 and
> >> printing to a Dymo 450) Thanks
> >> Tom Connolly

Something like this might work.

./print_marc.lisp foo.mrc | egrep -m 1 '^082|^083' | lpr -h

print_marc.lisp is:

#!/usr/bin/env clisp

;;; Program to print a file in MARC communications format
;;; human-readably.

(defvar *file* (car *args*))

(defun print-directory-entries (input base-address-of-data limit ptr step)
    (cond ((= limit 0))
	  (t (let* ((directory-entry (subseq input ptr (+ ptr step)))
		    (tag (subseq directory-entry 0 3))
		    (field-length (parse-integer (subseq directory-entry 3 7)))
		    (starting-character-position (parse-integer (subseq directory-entry 7 12)))
		    (field-start (+ base-address-of-data starting-character-position))
		    (field-end (+ field-start field-length))
		    (data (subseq input field-start field-end)))
	       (format t "~a ~a~%" tag data)
	       (print-directory-entries input base-address-of-data (decf limit) (+ ptr step) step)))))

(defun process (input)
"A MARC record contains a leader, followed by a directories listing,
followed by data. The leaders is 24 characters long. The first five
characters are the record length. Characters 12-16 indicate where the
data section begins. The first three characters of a directory entry
indicate the MARC tag. Characters 3-6 are the field length. Characters
7-11 are the starting character position of the corresponding data
relative to the base address of the data. Numbering begins from 0."
  (let* ((leader (subseq input 0 24))
	 (leader-length 24)
	 (directory-record-length 12)
	 (record_length (parse-integer (subseq input 0 5)))
	 (base-address-of-data (parse-integer (subseq input 12 17)))
	 (length-of-field (parse-integer (subseq input 20 21)))
	 (length-of-directory (- base-address-of-data (+ 1 leader-length)))
	 (number-of-fields (/ length-of-directory directory-record-length)))
    (format t "~a~%" leader)
    (print-directory-entries input base-address-of-data number-of-fields leader-length directory-record-length)))

(with-open-file (stream *file*)
		(do ((input (read-line stream nil)
			    (read-line stream nil)))
		    ((null input))
		    (process input)))

I'm not sure how you'd do it with MarcEdit.

-- 
Charles Blair, Director, Digital Library Development Center, University of Chicago Library
1 773 702 8459 | [log in to unmask] | http://www.lib.uchicago.edu/~chas/