Đến nội dung


Hình ảnh
- - - - -

Tách chuỗi trong lisp


  • Please log in to reply
11 replies to this topic

#1 dgqcc

dgqcc

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 15 October 2008 - 07:44 PM

Có 2 loại chuỗi:
abcx (abc cố định biết trước, x là số nguyên cần lấy)
dyz (d cố định biết trước, yz là số nguyên cần lấy)
Nhờ các bác viết giùm một đoạn code:
- Nếu gặp chuỗi abcx thì gán biến num = x
- Nếu gặp chuỗi dyz thì gán biến num = yz
Biến num mang giá trị số nguyên.
Ví dụ 2 chuỗi đó là: abc1; abc2 ... d10; d11 ...
Mong sự giúp đỡ của các bác.
Xin cảm ơn nhiều!
  • 0

#2 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 16 October 2008 - 01:26 PM

Có 2 loại chuỗi:
abcx (abc cố định biết trước, x là số nguyên cần lấy)
dyz (d cố định biết trước, yz là số nguyên cần lấy)
Nhờ các bác viết giùm một đoạn code:
- Nếu gặp chuỗi abcx thì gán biến num = x
- Nếu gặp chuỗi dyz thì gán biến num = yz
Biến num mang giá trị số nguyên.
Ví dụ 2 chuỗi đó là: abc1; abc2 ... d10; d11 ...
Mong sự giúp đỡ của các bác.
Xin cảm ơn nhiều!

Bạn dùng thử đoạn LISP này :
Hàm tách 1 chuỗi : trả về số nguyên (nếu thành công) với chuỗi định dạng cho trước.
(str_left_truncate "abc123" "abc") -> 123
(str_left_truncate "abc123.0" "abc") -> nil : 123.0 là số thực
(str_left_truncate "abc1 000" "abc") -> nil : 1 000 không phải là kiểu số
(defun str_left_truncate (str prefix / prefix_length str_pre str_suf num)
(setq prefix_length (strlen prefix)
str_pre (substr str 1 prefix_length)
)
(if (= str_pre prefix)
(progn
(setq str_suf (substr str (+ 1 prefix_length)))
(if (IsInteger str_suf)
(setq num (atoi str_suf))
)
)
)
)

(defun IsInteger (str)
(if (not(vl-string-search " " str))
(if (= (type (read str)) 'INT )
T
nil
)
nil
)
)


Minh họa : (nhớ copy các hàm phía trên)
(defun C:TachChuoi(/ str ss lst str_int ent nd num )
(setq str (getstring "Nhap chuoi dinh dang:"))
(princ "\nChon text:")
(setq ss (ssget (list (cons 0 "TEXT")))
lst (ss2ent ss)
str_int "")
(repeat (length lst)
(setq ent (entget (car lst))
lst (cdr lst)
nd (cdr (assoc 1 ent)) )
(if (setq num (str_left_truncate nd str))
(setq str_int (strcat (itoa num) " " str_int) )
)
); repeat
(if (/= str_int "")(alert (strcat "Cac so nguyen : " str_int) ))
(princ)
)

(defun ss2ent (ss / sodt index lstent)
(setq sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

  • 1

#3 dgqcc

dgqcc

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 17 October 2008 - 11:20 AM

Cảm ơn gia_bach nhiều!
Nhưng tôi có vấn đề là các chuỗi đó do ta chọn trên màn hình; và có 2 loại chuỗi như trên ( abc1; abc2; ... ; d10; d11; d12...)
làm sao khi chọn các chuỗi đó thì biến num chứa các giá trị là 1; 2 ...; 11; 12... Mục đích là tôi lấy các giá trị đó để tính toán.
Ví dụ thế này:
- Chọn danh sách các chuỗi.
- lấy các giá trị số nguyên vào biến num
- Tính 1 biểu thức nào đó VD: tong (* 2500 num)
- Tương ứng với mỗi chuỗi ta có 1 kết quả. ghi ra màn hình tất cả các giá trị của biến tong với 1 điểm cho trước
Mong sự giúp đỡ của các bác!
Xin cảm ơn nhiều.
  • 0

#4 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 17 October 2008 - 11:30 AM

Cảm ơn gia_bach nhiều!
Nhưng tôi có vấn đề là các chuỗi đó do ta chọn trên màn hình; và có 2 loại chuỗi như trên ( abc1; abc2; ... ; d10; d11; d12...)
làm sao khi chọn các chuỗi đó thì biến num chứa các giá trị là 1; 2 ...; 11; 12... Mục đích là tôi lấy các giá trị đó để tính toán.
Ví dụ thế này:
- Chọn danh sách các chuỗi.
- lấy các giá trị số nguyên vào biến num
- Tính 1 biểu thức nào đó VD: tong (* 2500 num)
- Tương ứng với mỗi chuỗi ta có 1 kết quả. ghi ra màn hình tất cả các giá trị của biến tong với 1 điểm cho trước
Mong sự giúp đỡ của các bác!
Xin cảm ơn nhiều.


(defun C:TachChuoi(/ str ss lst str_int ent nd num )
............................
(if (setq num (str_left_truncate nd str))
.............
)
Giá trị num của bạn đây.
Bạn tùy nghi xử lý .
  • 0

#5 dgqcc

dgqcc

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 22 (tàm tạm)

Đã gửi 17 October 2008 - 01:28 PM

Mới mày mò học LISP nên chưa biết nhiều.
Một lần nữa xin cảm ơn!
  • 0

#6 giaovanthongk50

giaovanthongk50

    biết pan

  • Members
  • Pip
  • 5 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 14 July 2014 - 01:27 PM

chào các anh chị,cho em hoi 1 chút,em có 1 chuỗi "Đất cấp 3 = 123.58 m2 ",em muốn tách số 123.58 ra thì làm thế nào


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 July 2014 - 02:23 PM

Gọi cái string của bạn là st, thì lấy số = (atof (substr st (+ 2 (vl-string-search "=" st))))


  • 0

#8 giaovanthongk50

giaovanthongk50

    biết pan

  • Members
  • Pip
  • 5 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 14 July 2014 - 02:59 PM

anh Tot77 nói rõ hơn 1 chút được ko ạ,em mới học lisp nên đang còn non lắm anh ạ


  • 0

#9 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 July 2014 - 03:16 PM

Hàm vl-string-search để tìm vị trí của "=" trong st

Hàm substr lấy chuỗi con của st bắt đầu từ vị trí mà hàm vl-string-search trả về (+ thêm 2 để loại bỏ dấu =)

Hàm atof để chuyển chuổi thành số.


  • 0

#10 giaovanthongk50

giaovanthongk50

    biết pan

  • Members
  • Pip
  • 5 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 17 July 2014 - 04:28 PM

các bậc tiền bối cho em hỏi là,em muốn tách 2 ký tự cuối cùng (m2) của chuỗi này thì làm thế nào ạ "Đất cấp 3 = 123.58 m2 "


  • 0

#11 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 17 July 2014 - 05:18 PM

tương tự như trên: (substr st (+ 1 (vl-string-search "m2" st))


  • 0

#12 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 17 July 2014 - 07:12 PM

Ý của bạn giaovanthong là lấy 2 ký tự cuối, không biết 2 ký tự đó là gì, chứ nếu biết là m2 thì cần gì lấy  :)  :)

Bạn lấy 2 ký tự cuối = (substr st (- (strlen st) 1)) 

strlen là hàm lấy số ký tự của chuỗi. Bạn để ý là -1 chứ kp -2.


  • 1