Sujet : Re: string search and assignment
De : No_spamming (at) *nospam* noWhere_7073.org (B. Pym)
Groupes : comp.lang.lispDate : 02. Jul 2024, 21:38:09
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v61kut$1p0ar$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
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
Gauche Scheme
(use file.util) ;; file->string-list
(use srfi-13) ;; string-tokenize
(use srfi-14) ;; character-sets
;; Assumes that the "next word" has to be on the same line.
(define (find-word-association-in-file word file)
(any
(lambda (line)
(let* ((words (string-tokenize line char-set:letter))
(tail (member word words string=?)))
(and tail (pair? (cdr tail)) (cadr tail))))
(file->string-list file)))
(find-word-association-in-file "FOO" "delete-me.txt")
===>
"OOF"
(find-word-association-in-file "PLOVER" "delete-me.txt")
===>
"PLUGH"
(find-word-association-in-file "PLUGH" "delete-me.txt")
===>
#f