自贡黄明儒 发表于 2011-4-29 18:35:45

求助:有没有函数方便地将字符串分割

本帖最后由 自贡黄明儒 于 2011-4-29 18:42 编辑

有没有函数方便地将字符串分割,比如"名称   重量数量", 分割后列成表("名称""重量 "" 数量")
如果有这样的一个函数存在,那么存放数据的文件(用如下函数)就相当简单了

GILES.LEI 发表于 2019-2-3 13:12:35

highflybird 发表于 2011-4-29 19:12
_$ (setq str "名称   重量数量")
"名称   重量数量"
_$ (setq str (STRCAT "(" str ")"))


用这个方法汉字中有小数点会出错这个是read函数的问题,例如:
命令: (READ (A.B))
; 错误: no function definition: A

highflybird 发表于 2011-4-29 19:12:21

_$ (setq str "名称   重量数量")
"名称   重量数量"
_$ (setq str (STRCAT "(" str ")"))
"(名称   重量数量)"
_$ (setq lst (read str))
(名称 重量 数量)
_$ (setq lst (mapcar 'VL-PRINC-TO-STRING lst))
("名称" "重量" "数量")

自贡黄明儒 发表于 2011-4-29 19:40:04

;;;谢谢版主highflybird,有了这样的函数,放数据的.text文件就简单多了
;;;highflybird真是高手呀!!!就这么几句就搞定了。
(defun strinSplit (str / lst)
(setq str (STRCAT "(" str ")"))
(setq lst (read str))
(setq lst (mapcar 'VL-PRINC-TO-STRING lst))
)

自贡黄明儒 发表于 2011-4-29 20:09:12

;;;我原来看过一本书,编程时存放数据如下,又是加括号,又是加引号,麻烦呀!
(        "DTII04C0532"        43.6        )
;;;有了版主highflybird的分割方法,存放数据完全可以如下,就方便多了。
DTII04C0532        43.6

jh1005 发表于 2011-4-29 23:11:55

本帖最后由 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))
)

pizg 发表于 2011-5-2 12:28:53

jh1005 发表于 2011-4-29 23:11 static/image/common/back.gif
在个类似的函数:

感謝 JH1005 提供源碼
但如果 (fsxm-Split"123我最帥""")
將會出問題!

jh1005 发表于 2011-5-2 22:30:29

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:39:56

本帖最后由 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)
)

cdma2546 发表于 2011-5-5 11:45:17

虽然有点晚,但是可以提个方向用正则应该也可以做到

highflybird 发表于 2011-5-5 12:04:28

本帖最后由 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
查看完整版本: 求助:有没有函数方便地将字符串分割