Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
- - - - -

Yêu Cầu Lisp Lọc Text Dạng Số Ra Khỏi Chuỗi Text


  • Please log in to reply
14 replies to this topic

#1 nhunha_pro279

nhunha_pro279

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 08 March 2017 - 03:25 PM

Em có một vấn đề muốn nhờ các cao thủ autolisp giúp đỡ. Ví dụ em có chuỗi text "Chiều dài đoạn là 150.5m" em muốn tách phần số 150.5 ra khỏi chuỗi text. Kính nhờ các cao thủ trợ giúp ạ.


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5488 Bài viết
Điểm đánh giá: 2648 (tuyệt vời)

Đã gửi 08 March 2017 - 04:48 PM

Gợi ý: duyệt qua từng ký tự của chuỗi, đến khi gặp ký tự là số thì cắt phần đầu đi, sau đó lấy atof của phần còn lại.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 nhunha_pro279

nhunha_pro279

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 08 March 2017 - 04:59 PM

Gợi ý: duyệt qua từng ký tự của chuỗi, đến khi gặp ký tự là số thì cắt phần đầu đi, sau đó lấy atof của phần còn lại.

Nhờ anh có thể chỉ giáo em về phần thuật toán được không ạ? Ý tưởng của em là như thế nhưng giải quyết vấn đề thì còn gà mờ lắm anh #Doan Van Ha ơi.


  • 0

#4 Bee

Bee

    biết lệnh hatchedit

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

Đã gửi 08 March 2017 - 05:35 PM

Em có một vấn đề muốn nhờ các cao thủ autolisp giúp đỡ. Ví dụ em có chuỗi text "Chiều dài đoạn là 150.5m" em muốn tách phần số 150.5 ra khỏi chuỗi text. Kính nhờ các cao thủ trợ giúp ạ.

Search search và search ^_^ tham khảo tí cái này thôi nhé.

 

(setq number (search "Chieu dai doan la 150.5m"))

(defun search (s)
  (vl-list->string
    (vl-remove-if
      '(lambda (x) (or (< x 48) (> x 57)))
      (vl-string->list s)
    )
  )
)

  • 1

#5 nhunha_pro279

nhunha_pro279

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 08 March 2017 - 07:47 PM

 

Search search và search ^_^ tham khảo tí cái này thôi nhé.

 

(setq number (search "Chieu dai doan la 150.5m"))

(defun search (s)
  (vl-list->string
    (vl-remove-if
      '(lambda (x) (or (< x 48) (> x 57)))
      (vl-string->list s)
    )
  )
)

Cảm ơn anh nhé! Với cú pháp hàm search của anh em đã làm được file lisp theo ý muốn của mình ạ. Hy vọng được anh giải thích rõ hơn về cú pháp của hàm và các hàm vl-, vla- trong visua lisp (em tìm tài liệu về vấn để này mà chưa tìm được). Mong được anh chỉ giáo thêm!


  • 0

#6 quocmanh04tt

quocmanh04tt

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 735 Bài viết
Điểm đánh giá: 348 (khá)

Đã gửi 08 March 2017 - 07:53 PM

Dùng hàm ở trên thì dấu thập phân bị mất. Nên theo ý bác Hạ!

*** VL-, VLA- ... Tham khảo: http://www.afralisp.net/archive/


  • 0

#7 Bee

Bee

    biết lệnh hatchedit

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

Đã gửi 08 March 2017 - 08:27 PM

Dùng hàm ở trên thì dấu thập phân bị mất. Nên theo ý bác Hạ!

*** VL-, VLA- ... Tham khảo: http://www.afralisp.net/archive/

Thập phân và chữ ko dấu thì update cái này của Tharwat ^_^ 

 

Nói chung là còn nhiều trường hợp nên chủ thớt phải tự xử lý theo ý của mình thôi.

(defun search (s)
  (vl-list->string
    (vl-remove-if
      '(lambda (x)
	 (or
	   (< 64 x 91)
	   (< 96 x 123)
	 )
       )
      (vl-string->list s)
    )
  )
)

  • 1

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5488 Bài viết
Điểm đánh giá: 2648 (tuyệt vời)

Đã gửi 08 March 2017 - 09:21 PM

Nên thông cảm nhau bởi ai cũng quá rành nguyên lý. Xui mà chủ thớt rên: Tại sao em nhập string là "Tổng chiều dài 3 đoạn là 150.5m" mà kết quả lại là 3.

Những câu hỏi kiểu này trả lời chán lắm.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#9 Bee

Bee

    biết lệnh hatchedit

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

Đã gửi 08 March 2017 - 09:52 PM

Nên thông cảm nhau bởi ai cũng quá rành nguyên lý. Xui mà chủ thớt rên: Tại sao em nhập string là "Tổng chiều dài 3 đoạn là 150.5m" mà kết quả lại là 3.

Những câu hỏi kiểu này trả lời chán lắm.

Hì bác Hạ toàn mớm ! Vì hỏi chung chung nên trả lời cũng chung chung như bác là chuẩn rồi. ^_^ Em chỉ lấy 1 ví dụ tham khảo mà chủ thớt like rồi nên thiết nghĩ finish thôi :D


  • 2

#10 nhunha_pro279

nhunha_pro279

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 09 March 2017 - 08:31 AM

Nên thông cảm nhau bởi ai cũng quá rành nguyên lý. Xui mà chủ thớt rên: Tại sao em nhập string là "Tổng chiều dài 3 đoạn là 150.5m" mà kết quả lại là 3.

Những câu hỏi kiểu này trả lời chán lắm.

Mong bác #Doan Van Ha có thể giải thích rõ hơn về vấn đề này được không ạ?


  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5488 Bài viết
Điểm đánh giá: 2648 (tuyệt vời)

Đã gửi 09 March 2017 - 08:34 AM

Mong bác #Doan Van Ha có thể giải thích rõ hơn về vấn đề này được không ạ?

Trong string trên có 2 con số: 3 và 150.5 vậy thì lisp không đủ thông minh để biết mà lấy số 3 hay số 150.5


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#12 nhunha_pro279

nhunha_pro279

    biết vẽ circle

  • Members
  • PipPip
  • 38 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 09 March 2017 - 09:09 AM

Trong string trên có 2 con số: 3 và 150.5 vậy thì lisp không đủ thông minh để biết mà lấy số 3 hay số 150.5

Thật ra em chưa nghĩ được trường hợp này? Nếu xảy ra trường hợp như trên thì có thể giải quyết được bằng cách nào không vậy Bác?


  • 0

#13 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4303 Bài viết
Điểm đánh giá: 3817 (đỉnh cao)

Đã gửi 09 March 2017 - 11:12 AM

Thật ra em chưa nghĩ được trường hợp này? Nếu xảy ra trường hợp như trên thì có thể giải quyết được bằng cách nào không vậy Bác?

 

Vì luật chơi nào cũng có quy định của nó. Nếu vi phạm thì sai, bị loại.

Lisp cũng chỉ là công cụ làm theo "luật" mà bạn đưa ra thôi

Bạn đưa ra luật chơi là được.....


  • 0

#14 tien2005

tien2005

    biết lệnh hatchedit

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

Đã gửi 09 March 2017 - 01:24 PM

Bạn dùng hàm này của Lee

;; Parse Numbers  -  Lee Mac
;; Parses a list of numerical values from a supplied string.

(defun LM:parsenumbers ( str )
    (   (lambda ( l )
            (read
                (strcat "("
                    (vl-list->string
                        (mapcar
                           '(lambda ( a b c )
                                (if (or (< 47 b 58)
                                        (and (= 45 b) (< 47 c 58) (not (< 47 a 58)))
                                        (and (= 46 b) (< 47 a 58) (< 47 c 58))
                                    )
                                    b 32
                                )
                            )
                            (cons nil l) l (append (cdr l) '(()))
                        )
                    )
                    ")"
                )
            )
        )
        (vl-string->list str)
    )
)

ví dụ:

(LM:parsenumbers "1a-2.3b4c56")
(1 -2.3 4 56)

  • 0

#15 Nad SK

Nad SK

    biết vẽ polygon

  • Members
  • PipPip
  • 71 Bài viết
Điểm đánh giá: -4 (bình thường)

Đã gửi 11 March 2017 - 08:13 PM

 

Bạn dùng hàm này của Lee

;; Parse Numbers  -  Lee Mac
;; Parses a list of numerical values from a supplied string.

(defun LM:parsenumbers ( str )
    (   (lambda ( l )
            (read
                (strcat "("
                    (vl-list->string
                        (mapcar
                           '(lambda ( a b c )
                                (if (or (< 47 b 58)
                                        (and (= 45 b) (< 47 c 58) (not (< 47 a 58)))
                                        (and (= 46 b) (< 47 a 58) (< 47 c 58))
                                    )
                                    b 32
                                )
                            )
                            (cons nil l) l (append (cdr l) '(()))
                        )
                    )
                    ")"
                )
            )
        )
        (vl-string->list str)
    )
)

ví dụ:

(LM:parsenumbers "1a-2.3b4c56")
(1 -2.3 4 56)

Lee Mac thì đỉnh rồi.

Chưa chạy thử nhưng cho hỏi dấu chấm câu và dấu chấm thập phân có là 1 hay là 2 vậy???

Nếu 2 thì quá hay.


  • -1