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 | [email protected] | http://www.lib.uchicago.edu/~chas/

Reply via email to