TheSwamp
Code Red => AutoLISP (Vanilla / Visual) => Topic started by: CAB on October 16, 2006, 09:55:29 AM
-
We've addressed this subject before although I can't find th thread.
So here it is again and with a twist.
First a string parser to separate the string into a list of strings using a
delimiter character.
This string "one,two,three,four" becomes '("one" "two" "three" "four")
Then a parser that allows for the use of an over ride of the delimiter.
So this "This|is|a`|test|string" becomes this '("This" " is" "a'|test" "string")
Although my routine did not remove override character perhaps it should.
So the result would be this '("This" " is" "a|test" "string")
Here are some form that I tested on mine.
(defun c:test ()
(print (sparser "This|is|a`|test|string" "|" "`"))
(print (sparser "|This|is|a`|test|string|" "|" "`"))
(print (sparser "`|This|is|a`|test|string`|" "|" "`"))
(print (sparser "" "|" "`"))
(print (sparser "`|This|is|a`|test|string`|" "|" ""))
(princ)
)
I clean up the list returned like this:
(vl-remove "" (sparser "This|is|a`|test|string" "|" "`"))
removing any empty text.
and or use this to remove the override characters
(mapcar '(lambda(x) (vl-string-subst "" skp x)) lst)
<edit: spelling correction>
-
Do you mean string parser (http://www.theswamp.org/index.php?action=search2;params=YWR2YW5jZWR8J3wxfCJ8YnJkfCd8MnwifHNob3dfY29tcGxldGV8J3wxfCJ8c3ViamVjdF9vbmx5fCd8fCJ8c29ydF9kaXJ8J3xkZXNjfCJ8c29ydHwnfElEX01TR3wifHNlYXJjaHwnfHBhcnNlcg==) Alan?
:)
-
Yes! :oops:
I guess there is no hope for me and my spelling.
Thanks for the help.
-
I guess there is no hope for me and my spelling. Thanks for the help.
No worries man -- someone had to take over for John.
:lol:
-
(defun str-str-lst (str pat / i)
(cond ((= str "") nil)
((setq i (vl-string-search pat str))
(cons (substr str 1 i)
(str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
) ;_ cons
)
(t (list str))
) ;_ cond
) ;_ defun
(str-str-lst "This|is|a`|test|string" "|" )
;=>'("This" "is" "a`" "test" "string")
(str-str-lst "|This|is|a`|test|string|" "|" )
;=>'("" "This" "is" "a`" "test" "string")
(str-str-lst "`|This|is|a`|test|string`|" "|" )
;=>'("`" "This" "is" "a`" "test" "string`")
(str-str-lst "" "|" )
;=> nil
(str-str-lst "`|This|is|a`|test|string`|" "|" )
;=>'("`" "This" "is" "a`" "test" "string`")
(str-str-lst "This|is|a`|test|string" "`|" )
;=> '("This|is|a" "test|string")
(str-str-lst "|This|is|a`|test|string|" "`|" )
;=>'("|This|is|a" "test|string|")
(str-str-lst "`|This|is|a`|test|string`|" "`|" )
;=>'("" "This|is|a" "test|string")
(str-str-lst "" "`|" )
;=> 'nil
(str-str-lst "`|This|is|a`|test|string`|" "`|" )
;=>'("" "This|is|a" "test|string")
(str-str-lst "This|is|a`|test|string" "`" )
;=>'("This|is|a" "|test|string")
(str-str-lst "|This|is|a`|test|string|" "`" )
;=>'("|This|is|a" "|test|string|")
(str-str-lst "`|This|is|a`|test|string`|" "`" )
;=>'("" "|This|is|a" "|test|string" "|")
(str-str-lst "" "`" )
;=>'nil
(str-str-lst "`|This|is|a`|test|string`|" "`" )
;=>'("" "|This|is|a" "|test|string" "|")
-
Thanks Evgeniy
Now one to do this:
Then a parser that allows for the use of an over ride of the delimiter.
So this "This|is|a`|test|string" becomes this '("This" " is" "a'|test" "string")
This will skip the `| just like wcmatch will ignore this `*
-
Thanks Evgeniy
Now one to do this:
Then a parser that allows for the use of an over ride of the delimiter.
So this "This|is|a`|test|string" becomes this '("This" " is" "a'|test" "string")
This will skip the `| just like wcmatch will ignore this `*
It is my old program, from my lessons on recursion...
-
How about this one.
(defun StrParsev02 (String Seperator / Pos1 Pos2 NewStrList)
(setq Pos2 1)
(while (setq Pos1 (vl-string-search Seperator String Pos1))
(if
(and
(> Pos1 1)
(/= (substr String Pos1 1) "`")
)
(progn
(if (= Pos2 1)
(setq NewStrList (cons (substr String Pos2 Pos1) NewStrList))
(setq NewStrList (cons (substr String Pos2 (- (1+ Pos1) Pos2)) NewStrList))
)
(setq Pos2 (1+ (+ (strlen Seperator) Pos1)))
)
)
(setq Pos1 (+ Pos1 (strlen Seperator)))
)
(reverse (setq NewStrList (cons (substr String Pos2) NewStrList)))
)
(defun c:test ()
(print (StrParsev02 "This|is|a`|test|string" "|"))
(print (StrParsev02 "|This|is|a`|test|string|" "|"))
(print (StrParsev02 "`|This|is|a`|test|string`|" "|"))
(print (StrParsev02 "" "|"))
(print (StrParsev02 "`|This|is|a`|test|string`|" "|"))
(princ)
)
Command: test
("This" "is" "a`|test" "string")
("|This" "is" "a`|test" "string" "")
("`|This" "is" "a`|test" "string`|")
("")
("`|This" "is" "a`|test" "string`|")
-
Thanks Tim.
Here are my routines
;;++++++++++++++++++
;; parser by CAB
;;++++++++++++++++++
;; this one removes parts of the source string
(defun sparaser (str delim / ptr lst)
(while (setq ptr (vl-string-search delim str))
(setq lst (cons (substr str 1 ptr) lst))
(setq str (substr str (+ ptr 2)))
)
(reverse (cons str lst))
)
;; This one uses pointers
(defun sparser (str delim / ptr lst stp)
(setq stp 1)
(while (setq ptr (vl-string-search delim str (1- stp)))
(setq lst (cons (substr str stp (- (1+ ptr) stp)) lst))
(setq stp (+ ptr 2))
)
(reverse (cons (substr str stp) lst))
)
;; This one uses pointers & allows a skip feature
;;++++++++++++++++++
;; parser by CAB
;;++++++++++++++++++
;; (sphraser "This|is|a`|test|string" "|" "`")
;; ("This" "is" "a`|test" "string")
(defun sparser (str delim skp / ptr lst stp st1)
(setq stp 1
st1 1)
(while (setq ptr (vl-string-search delim str (1- stp)))
(if (/= (substr str (max ptr 1) 1) skp)
(setq lst (cons (substr str st1 (- (1+ ptr) st1)) lst)
st1 (+ ptr 2))
(setq st1 stp)
)
(setq stp (+ ptr 2))
)
(reverse (cons (substr str st1) lst))
)