明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3323|回复: 9

请帮忙解决用autolisp读取txt文件问题

[复制链接]
发表于 2006-12-22 18:21:00 | 显示全部楼层 |阅读模式

请专家帮忙:

我在试图用autolisp读取txt文件中的数据,程序如下:

(defun c:zdm()

(setq f  (open "d:\ct-aaa.txt" "r"))
(setq hantxt (read-line))
(print yhantxt)
  (close f)
)

d:\ct-aaa.txt的内容如下:

25223562, 47547477,
545747,  5

可是好像什么都读不出来,死循环,要敲回车键才能退出。

各位高手能否指点迷津?

发表于 2006-12-22 20:29:00 | 显示全部楼层

(defun c:zdm(/ str list1)

(setq f  (open "d:\\ct-aaa.txt" "r");注意此处有错

 str(read-line a)

 list1 nil

)

(while str

  (setq list1 (append list1 (list str))

str(read-line f)

)

)

  (close f)

list1
)

(princ (c:zdm))

试试这个。

发表于 2006-12-23 16:19:00 | 显示全部楼层

(defun c:zdm()

  (setq f  (open "d:/ct-aaa.txt" "r"))
  (setq hantxt (read-line))
  (print hantxt)
  (close f)
)

发表于 2006-12-27 20:14:00 | 显示全部楼层

您看:下面的程序产生的txt文件,第一列代表节点号,第一列代表坐标X值,第一列代表坐标Y.

T1.txt

T1         493364.659    331110.429

T2         493381.852    331052.463

T3     493524.444    331099.020

 

我想画pline线并标节点号,

怎么读完是下面这样啊:

 ("T1  \t493364.659 \t331110.429" "T2  \t493381.852 \t331052.463" "T3 \t493524.444 \t331099.020")

对于这样的结果是不能用的吧。

我能变成下面的文件就好用了

T1     493364.659    331110.429

T2     493381.852    331052.463

T3   493524.444     331099.020

 

请问各大侠:我怎么编程啊;我用read函数后,\t493364.659会变为493364.0,小数点后4舍5入了,好郁闷啊?
发表于 2006-12-27 21:48:00 | 显示全部楼层

加上这一句

....

(setq hantxt (read (strcat "(" (read-line) ")")))

......

发表于 2006-12-28 10:58:00 | 显示全部楼层
本帖最后由 作者 于 2006-12-28 13:10:31 编辑

  1. (DEFUN C:TEST ()
  2. (SETVAR "CMDECHO" 0)
  3. (IF (SETQ F (OPEN "D:/T-AAA.TXT" "r")) (PROGN
  4.   (SETQ LST (LIST (READ (STRCAT "(" (SUBSTR (READ-LINE F) 2) ")"))))
  5.   (WHILE (SETQ STR (READ-LINE F))
  6.    (SETQ LST (APPEND LST (LIST (READ (STRCAT "(" (SUBSTR STR 2) ")"))))
  7.   )
  8.   (CLOSE F)
  9.   (SETQ I 0)
  10.   (SETQ PT (CDAR LST))
  11.   (COMMAND "PLINE" PT)
  12.   (REPEAT (LENGTH LST)
  13.    (SETQ PT (CDR (NTH (SETQ I (1+ I)) LST))
  14.    (COMMAND PT)
  15.   )
  16.   (COMMAND "")
  17.   (SETQ I -1)
  18.   (REPEAT (LENGTH LST)
  19.    (SETQ PS (NTH (SETQ I (1+ I)) LST)
  20.          PN (STRCAT "T" (CAR PS))
  21.          PT (CDR PS))
  22.    (COMMAND "TEXT" PT "" "" PN)
  23.   )
  24. ))
  25. (SETVAR "CMDECHO" 1)
  26. (PRINC)
  27. )
复制代码
发表于 2006-12-28 16:10:00 | 显示全部楼层

楼上ZZXXQQ版主,您好

我怎么运行程序后,总提示有错"错误: 输入的列表有缺陷"

另外,"read"函数不能随便用,比如(read "(493364.659 331110.429  )"),运行后为(493365.0 331110.0).

read函数,受lisp限制,数据被四舍五入了,所以是不能用的.

用下面的程序,能把txt数据,按行加括号

(setq f (getfiled "选择一个文件" "" "" 8))
          (setq f(findfile f))
          (SetQ  fn (Open f "r") )
          (SetQ  fnn (Open "asasw" "w") )
(While (SetQ a1 (Read-Line fn))
   (setq fila (strcat "(" a1 ")"  ) )
    (SetQ  fnnn (write-line fila  fnn )) ;
)
  (Close fn)
(Close fnn)

功能:

T1.txt

T1         493364.659    331110.429

T2         493381.852    331052.463

T3     493524.444    331099.020

变成下面的文件就好用了

T1     493364.659    331110.429

T2     493381.852    331052.463

T3   493524.444     331099.020

T1     493364.659    331110.429

T2     493381.852    331052.463

T3   493524.444     331099.020

发表于 2006-12-28 16:32:00 | 显示全部楼层

用autolisp读取txt文件问题,实际上有好多方法,上面只是其中一种,最终还要根据txt文件的结构来确定.

最主要函数是字符串的转换.对任何txt文件,合理利用下面函数的搭配,就能解决lisp读txt问题

(vl-string-trim " " aa)
(ascii "(")
(ascii ")")
(ascii ".")
(chr 9)
(vl-string-search " " a1)

(write-char 67 f)

(setq a1w(vl-string->list  fila))
(SetQ  fnn (Open "asas" "w") )

(foreach a  a1w
  (progn  (write-char a  fnn)
      )
)

发表于 2006-12-28 16:49:00 | 显示全部楼层

还有一个例子,(转贴)

(这是一个有关DMC配准前读txt中(见附件)的特定字符串后坐标的小程序,例子中我只提取西南和东北角点的X,Y坐标)

(defun c:DMCpz ( / txt fi start li str_tfh str_blc
  str_WSx str_WSy str_ENx str_ENy WS_x WS_y EN_x EN_y
        )
 
   (setq path_txt (getfiled "Select .txt file" "" "txt" 2))
   (setq fi (open path_txt "r"))
 
   (setq ;str_tfh ""
 str_WSx ""
 str_WSy ""
 str_ENx ""
 str_ENy ""
 ;str_blc "1:5000"
 )
 
  (setq start T)
 
  (while (and start (setq li (read-line fi)))
    (cond
      ((wcmatch li "*图号*") (setq str_tfh li))
      ((wcmatch li "*DOM裁切范围西南角点X坐标*") (setq str_WSx li))
      ((wcmatch li "*DOM裁切范围西南角点Y坐标*") (setq str_WSy li))
      ((wcmatch li "*DOM裁切范围东北角点X坐标*") (setq str_ENx li))
      ((wcmatch li "*DOM裁切范围东北角点Y坐标*") (setq str_ENy li)(setq start nil))
      (t nil)
    )
  )
    (setq WS_x
      (atof (substr str_WSx (+ 1 (strlen ":") (vl-string-search ":" str_WSx)))
             ))
    (setq WS_y
      (atof (substr str_WSy (+ 1 (strlen ":") (vl-string-search ":" str_WSy)))
             ))
    (setq EN_x
      (atof (substr str_ENx (+ 1 (strlen ":") (vl-string-search ":" str_ENx)))
             ))
    (setq EN_y
      (atof (substr str_ENy (+ 1 (strlen ":") (vl-string-search ":" str_ENy)))
             ))
  
     (command ".line" (list WS_x WS_y) (list EN_x EN_y) "")
      
    (close fi)
  (princ)
)

发表于 2006-12-30 08:40:00 | 显示全部楼层
太忙,程序未调试。下面是调试好的程序:
  1. (DEFUN C:TEST ()
  2. (SETVAR "CMDECHO" 0)
  3. (IF (SETQ F (OPEN "D:/T-AAA.TXT" "r")) (PROGN
  4.   (SETQ LST (LIST (READ (STRCAT "(" (SUBSTR (READ-LINE F) 2) ")"))))
  5.   (WHILE (SETQ STR (READ-LINE F))
  6.    (SETQ LST (APPEND LST (LIST (READ (STRCAT "(" (SUBSTR STR 2) ")")))))
  7.   )
  8.   (CLOSE F)
  9.   (SETQ I 0)
  10.   (SETQ PT (CDAR LST))
  11.   (COMMAND "PLINE" PT)
  12.   (REPEAT (LENGTH LST)
  13.    (SETQ PT (CDR (NTH (SETQ I (1+ I)) LST)))
  14.    (COMMAND PT)
  15.   )
  16.   (COMMAND "")
  17.   (SETQ I -1)
  18.   (REPEAT (LENGTH LST)
  19.    (SETQ PS (NTH (SETQ I (1+ I)) LST)
  20.   PN (STRCAT "T" (ITOA (CAR PS)))
  21.   PT (CDR PS))
  22.    (COMMAND "TEXT" PT 10 "" PN)
  23.   )
  24. ))
  25. (SETVAR "CMDECHO" 1)
  26. (PRINC)
  27. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-23 11:35 , Processed in 0.286844 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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