求助:有没有函数方便地将字符串分割
本帖最后由 自贡黄明儒 于 2011-4-29 18:42 编辑有没有函数方便地将字符串分割,比如"名称 重量数量", 分割后列成表("名称""重量 "" 数量")
如果有这样的一个函数存在,那么存放数据的文件(用如下函数)就相当简单了
highflybird 发表于 2011-4-29 19:12
_$ (setq str "名称 重量数量")
"名称 重量数量"
_$ (setq str (STRCAT "(" str ")"))
用这个方法汉字中有小数点会出错这个是read函数的问题,例如:
命令: (READ (A.B))
; 错误: no function definition: A
_$ (setq str "名称 重量数量")
"名称 重量数量"
_$ (setq str (STRCAT "(" str ")"))
"(名称 重量数量)"
_$ (setq lst (read str))
(名称 重量 数量)
_$ (setq lst (mapcar 'VL-PRINC-TO-STRING lst))
("名称" "重量" "数量") ;;;谢谢版主highflybird,有了这样的函数,放数据的.text文件就简单多了
;;;highflybird真是高手呀!!!就这么几句就搞定了。
(defun strinSplit (str / lst)
(setq str (STRCAT "(" str ")"))
(setq lst (read str))
(setq lst (mapcar 'VL-PRINC-TO-STRING lst))
) ;;;我原来看过一本书,编程时存放数据如下,又是加括号,又是加引号,麻烦呀!
( "DTII04C0532" 43.6 )
;;;有了版主highflybird的分割方法,存放数据完全可以如下,就方便多了。
DTII04C0532 43.6 本帖最后由 jh1005 于 2013-7-27 20:33 编辑
类似的函数:
;by fsxm
;用分隔符解释字符串成表
(defun fsxm-Split (string strkey / po strlst xlen)
(setq xlen (1+ (strlen strkey)))
(while (setq po (vl-string-search strkey string))
(setq strlst (cons (substr string 1 po) strlst))
(setq string (substr string (+ po xlen)))
)
(reverse (cons string strlst))
)
jh1005 发表于 2011-4-29 23:11 static/image/common/back.gif
在个类似的函数:
感謝 JH1005 提供源碼
但如果 (fsxm-Split"123我最帥""")
將會出問題! pizg 发表于 2011-5-2 12:28 static/image/common/back.gif
感謝 JH1005 提供源碼
但如果 (fsxm-Split"123我最帥""")
將會出問題!
另一个版本,明经函数库里的:
http://www.mjtd.com/function/alisp/053.htm 本帖最后由 qjchen 于 2011-5-2 22:45 编辑
Highflybird版主的是好方法:)
以前编写过一个如下的函数,用于 分割字符串的
与http://www.mjtd.com/function/alisp/053.htm
的不同之处,是可以同时处理 多个作为分割的字符,如",;"
;;;;字符串函数
;;;;str是准备被处理的字符串,delim是一个字符串集合,其中的每一个字符都会被
;;;;当作是分割符号
;;;;如 (q:str:delim "25 35 45 ; 55, 66 " " ;")=> ("25" "35" "45" "55," "66")
;;;by qjchen@gmail.com
(defun q:str:delim(str delim / l1 l2)
(setq str (vl-string->list str) delim (vl-string->list delim))
(while str
(if (not (member (car str) delim))
(setq l1 (cons (car str) l1))
(if l1 (setq l2 (cons (vl-list->string (reverse l1)) l2) l1 nil))
)
(setq str (cdr str))
)
(if l1 (setq l2 (cons (vl-list->string (reverse l1)) l2)))
(reverse l2)
)
虽然有点晚,但是可以提个方向用正则应该也可以做到 本帖最后由 highflybird 于 2011-5-5 12:10 编辑
这样也很简单: 可以处理各种字符和多个字符作分割串的。
(defun Split (String Delimiter / str lst)
(setq str (VL-STRING-TRANSLATEDelimiter " " String)) ;首先替换
(setq str (strcat "(" str ")")) ;然后加括号
(setq lst (read str)) ;读
(setq lst (mapcar 'VL-PRINC-TO-STRING lst)) ;转化
)
页:
[1]
2