• Re: string search and assignment

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp on Thu Jun 26 21:07:06 2025
    From Newsgroup: comp.lang.lisp

    B. Pym wrote:

    Kent M. Pitman wrote:

    ... What i want to do is start at the beginning of the
    file( which I can do) and search for the word "entity".
    Once I find this, I want to assign the next word to a
    variable. ...

    Use WITH-OPEN-FILE to open the stream. It will let you specify
    a variable to which the stream is bound. The I/O routines all
    take a stream as argument. e.g.,

    (defun find-word-association-in-file (word file)
    (with-open-file (stream file :direction :input)
    (loop
    (let ((line (read-line stream nil nil)))
    (declare (type string line))
    (unless line (return nil))
    (let ((pos1 (position #\Space line :test #'char-equal)))
    (when (and pos1 (string-equal word line :end2 pos1))
    (let ((pos2 (position #\Space line
    :test (complement #'char-equal)
    :start pos1)))
    (when pos2
    (return (subseq line pos2
    (position #\Space line
    :test #'char-equal
    :start pos2)))))))))))

    Given a data file "delete-me.text" containing:

    FOO OOF
    BAR RAB XYZZY
    BAZ ZAB PLOVER PLUGH
    NUL NIL

    I find that:

    (find-word-association-in-file "FOO" "delete-me.text") => "OOF"
    (find-word-association-in-file "BAZ" "delete-me.text") => "ZAB"
    (find-word-association-in-file "NUL" "delete-me.text") => "NIL"
    (find-word-association-in-file "GEE" "delete-me.text") => NIL

    Scheme

    (define (find-word-association-in-file word file)
    (with-input-from-file file
    (lambda()
    (let go ((s (read)))
    (cond ((eof-object? s) #f)
    ((equal? s word) (read))
    (#t (go (read))))))))

    (find-word-association-in-file 'FOO "delete-me.text")
    ===>
    OOF

    (find-word-association-in-file 'BAZ "delete-me.text")
    ===>
    ZAB

    (find-word-association-in-file 'PLOVER "delete-me.text")
    ===>
    PLUGH

    (find-word-association-in-file 'OOF "delete-me.text")
    ===>
    BAR

    (find-word-association-in-file 'NOWHERE "delete-me.text")
    ===>
    #f


    --- Synchronet 3.21d-Linux NewsLink 1.2