77077 发表于 2014-2-12 23:02:24

求助:读取文件并按列将文件转换为表;

本帖最后由 77077 于 2014-2-12 23:05 编辑

有一个txt文本,格式如下:
;序号                        X                        Y                        Z
A0001                   566786.336      3378751.937            5.014
B0002                   566786.982      3378747.011            4.700
C0003                   566787.331      3378747.086            4.822
D0004                   566787.454      3378746.524            4.620
……
我想将每一列数据分别读取到不同的表中,以";"开头的不读取该行,希望得到结果如下:
lst1中就是(A001 B002 C003 D004……)
lst2中就是(566786.336 566786.982 566787.331566787.454……)
lst3......
lst4......


查找了写论坛代码,可能是没找仔细,暂时还没找到读取文本文件列到表的,希望高手们帮下忙.


xyp1964 发表于 2014-2-13 00:20:29

;; 需要e派工具箱(XCAD)的支持:http://yunpan.cn/QXQKsW9gAPmpF
(defun c:tt ()
(setq lst(xyp-txt2list "d:\\临时.txt")
      lst(vl-remove-if '(lambda (x) (= (substr x 1 1) ";")) lst)
      lst(mapcar 'xyp-Get-Str2Lst lst)
      lst1 (mapcar 'car lst)
      lst2 (mapcar 'cadr lst)
      lst3 (mapcar 'caddr lst)
      lst4 (mapcar 'caddr lst)
)
(princ)
)

77077 发表于 2014-2-13 12:40:36

本帖最后由 77077 于 2014-2-13 12:44 编辑

院长果然厉害!
求编成函数代码"txt列到list"!

xyp1964 发表于 2014-2-13 13:03:04

77077 发表于 2014-2-13 12:40 static/image/common/back.gif
院长果然厉害!
求编成函数代码"txt列到list"!;; (abc "d:\\临时.txt")
(defun abc (file-txt / lst)
(setq lst (xyp-txt2list file-txt)
      lst (vl-remove-if '(lambda (x) (= (substr x 1 1) ";")) lst)
      lst (mapcar 'xyp-Get-Str2Lst lst)
)
(list (mapcar 'car lst)
      (mapcar 'cadr lst)
      (mapcar 'caddr lst)
      (mapcar 'caddr lst)
)
)

77077 发表于 2014-2-13 15:54:25

本帖最后由 77077 于 2014-2-13 16:00 编辑

文本数据格式如下
$       lst1       lst2   lst3    lst4    lst5    lst6
ID      A          01   A1      B1      C1      D1
ID      B          02   A2      B2      C2      D1
ID      C          03   A3      B3      C3      D1
ID      D          04   A4      B4      C4      D1

lst代码如下,不过只能获取到lst4(defun c:test (/ fp str lst )
   (setq fp (open "D:\\MyTools\\lisp-txt.txt" "r"))    ; 文件
   (while (and (setq str (read-line fp)) (not (wcmatch str "ID*"))))
   (while (not (wcmatch str "$$$$$$$$$$$$$$$$*"))
   (setq lst (cons (read (strcat "(" (substr str 3) ")")) lst)
         str (read-line fp)
   ) )
   (close fp)
   (reverse lst)
(setq lst1 (mapcar 'car lst)
      lst2 (mapcar 'cadr lst)
      lst3 (mapcar 'caddr lst)
      lst4 (mapcar 'cadddr lst))
)有人说用nth,试着写了一下,都失败了!
(setq lst1 (nth 0 lst)
      lst2 (nth 1 lst)
      lst3 (nth 2 lst)
      lst4 (nth 3 lst)
      lst5 (nth 4 lst)
      lst6 (nth 5 lst))

77077 发表于 2014-2-13 16:03:47

用nth修改后运行结果
得到的数据不是按列,而是按行了!

77077 发表于 2014-2-13 18:21:23

(setq lst1 (mapcar '(lambda (x) (nth 0 x)) lst)
      lst2 (mapcar '(lambda (x) (nth 1 x)) lst)
      lst3 (mapcar '(lambda (x) (nth 2 x)) lst)
      lst4 (mapcar '(lambda (x) (nth 3 x)) lst)
      lst5 (mapcar '(lambda (x) (nth 4 x)) lst))

xyp1964 发表于 2014-2-13 19:30:54

77077 发表于 2014-2-13 18:21 static/image/common/back.gif
(setq lst1 (mapcar '(lambda (x) (nth 0 x)) lst)
      lst2 (mapcar '(lambda (x) (nth 1 x)) lst) ...

;; (abcd "d:\\临时.txt")
(defun abcd (file-txt / lst n lst1 i)
(setq lst(xyp-txt2list file-txt)
        lst(vl-remove-if '(lambda (x) (= (substr x 1 1) ";")) lst)
        lst(mapcar 'xyp-Get-Str2Lst lst)
        lst1 '()
        i 0
)
(repeat (length (car lst))
    (setq a (mapcar '(lambda (x) (nth i x)) lst)
          i (1+ i)
          lst1 (cons a lst1)
    )
)
(reverse lst1)
)
页: [1]
查看完整版本: 求助:读取文件并按列将文件转换为表;