找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1875|回复: 25

[分享]:我编的字符串转化为表的子程序

[复制链接]

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2003-12-18 19:53:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
;将一行字符串转为表,逗号分隔,并取掉双引号

  1.   [FONT=courier new]
  2. (defun str_to_list(str / i one l strl)
  3.   (setq one "")
  4.   (setq strl (strlen str))
  5.   (setq i 1)
  6.   (while (<= i strl)
  7.     (if        (/= "," (substr str i 1))
  8.       (setq one (strcat one (substr str i 1)))
  9.       (progn
  10.         (if (= "." (substr one 1 1))
  11.           (setq one (strcat "0" one))
  12.         )
  13.         (setq l (append l (list (read one))))
  14.         (setq one "")
  15.       )
  16.     )
  17.     (setq i (1+ i))
  18.   )
  19.   (if (= "." (substr one 1 1))
  20.     (setq one (strcat "0" one))
  21.   )
  22.   (setq l (append l (list (read one))))
  23.   l
  24. )
  25. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-19 10:34:01 | 显示全部楼层
也贴一个, 以空格分隔:

(defun c:test (str / sl pos)
  (setq        str (strcat str " "))
  (while (> (strlen str) 1)
    (setq pos (vl-string-search " " str))
    (if pos
      (setq sl (append sl (list (substr str 1 pos)))
           str (substr str (+ 2 pos)))
    )
  )
  sl
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-19 14:29:24 | 显示全部楼层
其实如果字符以空格分隔的话,转换为表是最好写的了.呵呵

运用两个lsp函数,最多只要用两行, 就可写出 ................谁先来试试? 如果过两天还没人知道我是怎么做的,那时再贴出我的程序.
至于逗号分隔的嘛,我想大概3,4行就能写出吧,还没试:)

如:
"两个lsp 函数 最多 只要用 两行 1515 858.56 e85" ->(两个lsp 函数 最多 只要用 两行 1515 858.56 e85)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2003-12-19 14:46:39 | 显示全部楼层
如下:
(READ (STRCAT "(" STR ")"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-19 15:07:02 | 显示全部楼层
最初由 陌生人 发布
[B]其实如果字符以空格分隔的话,转换为表是最好写的了... [/B]


将程序中的" " 换成","即可以处理逗号分隔的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-19 19:08:51 | 显示全部楼层
最初由 zhang8755 发布
[B]如下:
(READ (STRCAT "(" STR ")")) [/B]


对了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 03:33:58 | 显示全部楼层
可是(READ (STRCAT "(" STR ")")) 只能用于空格符分割的呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 08:35:41 | 显示全部楼层
明经的函数,里面有现成的。包括串-〉表 和 表-〉串。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 10:46:43 | 显示全部楼层
我觉得应该给 zhang8755 加币鼓励
lsjjm ,没错,这是个特例. 只有在分隔符含有空格的时候,这个写法才成立.之所以说是'含有",如分隔符列特征字符串 "  ; . -" 都可处理,条件是分隔符转为空格的时候分隔都复合要求,否则,这样的写法就不成立了.

楼上的,不仅明经里面有这样的函数,其他还有很多.我们在这里不是讨论如何实现,而是讨论如何编程实现,不过还是谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2003-12-20 11:39:51 | 显示全部楼层
我的上述程序中如下三行是用来处理以点开头的浮点数,在前面补个零。因为lisp中不允许数值以点开头,以免和点对表混淆。
  (if (= "." (substr one 1 1))
    (setq one (strcat "0" one))
  )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 12:55:51 | 显示全部楼层
这样写可能清楚些:
str- 字符串 div-任意分隔符(CAD有效的)
(defun str2list (str div / sl pos)
  (setq str (strcat str div))
  (while (> (strlen str) 1)
    (setq pos (vl-string-search div str))
    (if pos
      (setq sl (append sl (list (substr str 1 pos)))
             str (substr str (+ 2 pos)))
    )
  )
  sl
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 16:23:14 | 显示全部楼层
完善下,写一个支持分割符串的吧
如: ";, " 对用; , (空格) 分隔的字符串转换为表

另外:用(str2list "12 啊;1.1,;; ,1,,a" ";")
返回:("12 啊" "1.1," "" " ,1,,a")
有两个" " ,应该做个判断避开

我晚上贴我的程序:)
(str2lst "12 啊;1.1,;; ,1,,a" " ;,")
返回:("12" "啊" "1.1" "1" "a")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2003-12-20 18:17:22 | 显示全部楼层
只需作如下修改

  1.   [FONT=courier new]
  2. (defun str_to_list(str / i one l strl)
  3.   (setq one "")
  4.   (setq strl (strlen str))
  5.   (setq i 1)
  6.   (while (<= i strl)
  7.     (if        (and  (/= ";" (substr str i 1))(/= "," (substr str i 1))
  8.                 (/= ":" (substr str i 1))(/= " " (substr str i 1)))
  9.       (setq one (strcat one (substr str i 1)))
  10.       (progn
  11.         (if (= "." (substr one 1 1))
  12.           (setq one (strcat "0" one))
  13.         )
  14.         (setq l (append l (list (read one))))
  15.         (setq one "")
  16.       )
  17.     )
  18.     (setq i (1+ i))
  19.   )
  20.   (if (= "." (substr one 1 1))
  21.     (setq one (strcat "0" one))
  22.   )
  23.   (setq l (append l (list (read one))))
  24.   l
  25. )
  26.   [/FONT]

增加对空格的支持
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-20 18:31:04 | 显示全部楼层
反映好快,很好:)
测试了楼上的
"12 啊;1.1,;; ,.1,,a"
返回:
(12 1.1 nil nil nil 0.1 nil A)



另外提出一个:用read后,小写变大写了.谁考虑下如何保持原貌?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2003-12-20 18:43:27 | 显示全部楼层
小写变大写了的问题还没想出好办法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 03:53 , Processed in 0.186102 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表