Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Zahl (en) in einem Textstring herausfinden

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Zahl (en) in einem Textstring herausfinden (1974 mal gelesen)
Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 22. Mrz. 2010 14:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Forum!
Ich habe mal wieder ein kleines Problem! Ich habe in einem Textstring ein oder mehrere Zahlen. Diese können wie folgt aussehen:
abc1 oder abc1 def12
Ich muss nun die Zahl(en) aus diesem Textstring herausfiltern. Wichtig ist dabei für mich die Information, ob es eine oder mehrere Zahlen gibt und wieviel Stellen diese haben (inklusive Komma, wenn vorhanden).
Bis jetzt gehe ich folgendermaßen vor:
Zuerst gucke ich mir jede Stelle einzeln nacheinander an mit (setq teiltext (substr "abc1 def12" zaehler 1)); danach prüfe ich mit (wcmatch teiltext "#"), ob es sich um eine Zahl handelt. Wenn ja, dann gucke ich nach der nächsten Stelle und prüfe ob es sich um eine mehrstellige Zahl handelt oder ob danach noch etwas anderes folgt.
Nun kommt mir mein Verfahren etwas langsam vor, da einige Textstrings etwas länger sind und viele einzeln Ziffern beinhalten. Gibt es eine Möglichkeit direkt die Position und Länge der Ziffer herauszubekommen?

Ich freue mich auf Eure Hilfe!

Grüße Sven
P.S.: Bitte daran denken, dass ich kein Profi im Bereich LISP bin!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13435
Registriert: 30.11.2003

.

erstellt am: 22. Mrz. 2010 15:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

suchst du sowas :

(apply 'strcat (mapcar 'chr(vl-remove-if-not '(lambda(X)(member X
(vl-string->list "0123456789.")))(vl-string->list "def12.3wer"))))

liefert dir 12.3

------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 22. Mrz. 2010 16:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Wow!
Die Funktion ist super, auch wenn ich noch leichte Verständnisprobleme habe. Allerdings benötige ich die Zahlen getrennt, so wie sie im Textstring vorkommen (das ganze möglichst mit Angabe, an welcher Position sie waren).
Mal gucken ob ich das daraus basteln kann!?!
Vielen Dank!

Grüße Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas Kraus
Mitglied
Elektrotechniker


Sehen Sie sich das Profil von Andreas Kraus an!   Senden Sie eine Private Message an Andreas Kraus  Schreiben Sie einen Gästebucheintrag für Andreas Kraus

Beiträge: 1162
Registriert: 11.01.2006

WIN 10
ACAD 2017

erstellt am: 22. Mrz. 2010 16:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hallo Sven,
ich hab mal was hier reingestellt was dir helfen könnte.

Link

Die drei Funktionen könntest du folgendermaßen verwenden:

Als Beispieltext nehmen wir mal "abc123def123.4 56ghi"

(setq txt "abc123def123.4 56ghi")

Mit:
(zerlege_text txt (setq filter "*[~0123456789`.]*") 2)

bekommst du die Zahlen als Liste.
("123" "123.4" "56")

Die Positionen bekommst du mit folgender Idee:

Mit:
(wcmatch_pos txt filter)

bekommst du (weil wir ja mit dem Filter NICHT nach Zahlen suchen) die Positionen aller Strings die KEINE Zahl sind, und deren Länge (in diesem Fall alle Länge 1).
((1 1) (2 1) (3 1) (7 1) (8 1) (9 1) (15 1) (18 1) (19 1) (20 1))

Jetzt brauchen wir nur noch nachzuschauen welche Positionen hier NICHT vorkommen und wir haben die Positionen der Zahlen   .

Also:
(setq n 1)
(setq p_list nil)
(repeat (strlen txt)
  (setq p_list (cons (if (assoc n (wcmatch_pos txt filter))
       nil
       n
     )
     p_list
       )
  )
  (setq n (1+ n))
)
(setq p_list (reverse (vl-remove nil p_list)))

(4 5 6 10 11 12 13 14 16 17)

Wenn du nur die Startpositionen brauchst kann man auch was basteln.

Hoffentlicht hilfts dir.

------------------
Gruß
Andreas
http://kraus-cad.de

[Diese Nachricht wurde von Andreas Kraus am 22. Mrz. 2010 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas Kraus
Mitglied
Elektrotechniker


Sehen Sie sich das Profil von Andreas Kraus an!   Senden Sie eine Private Message an Andreas Kraus  Schreiben Sie einen Gästebucheintrag für Andreas Kraus

Beiträge: 1162
Registriert: 11.01.2006

WIN 10
ACAD 2017

erstellt am: 23. Mrz. 2010 15:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Die Startpositionen der Texte bekomme ich sogar einfacher mit:

(mapcar 'car (wcmatch_pos txt (substr (apply 'strcat (mapcar '(lambda (dummy) (strcat ",*" dummy "*") ) (zerlege_text txt "*[~0123456789`.]*" 2))) 2)))

------------------
Gruß
Andreas

http://kraus-cad.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 24. Mrz. 2010 08:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Andreas,
tut mir leid, das ich erst Heute wieder melde, aber war gerade ein wenig unterwegs. Vielen Dank für Deine Antwort! Das ist glaube ich genau das, was ich suche! Muss mir das nachher einmal in Ruhe anschauen, damit ich verstehe, was dort passiert. Im Moment sehe ich noch nicht, in welchem Symbol die Liste gespeichert wird. Aber vielleicht habe ich die Augen noch nicht richtig auf!
Vielen Dank für die Hilfe!
Grüße Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 24. Mrz. 2010 09:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Andreas,
ich bin es doch noch einmal mit einer Frage!
Wenn jetzt der Text zum Beispiel wie folgt aussieht:
(setq txt "T27 V1")

und der Aufruf wie folgt:
(zerlege_text txt (setq filter "*[~0123456789`.]*") 2)

dann bekomme ich leider nur folgende Liste zurück:
("27")

Das passiert immer, wenn die letzte Ziffer nur einstellig ist!?! Oder habe ich etwas verkehrt gemacht? Und in welchem Symbol steht diese Liste überhaupt, wie kann ich auf diese zugreifen? Ich stehe etwas auf dem Schlauch und finde es nicht! 

Vielen Dank für Deine Hilfe!
Grüße Sven

[Diese Nachricht wurde von Big Sven am 24. Mrz. 2010 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dorfy
Mitglied
Double-Dipl.-Ing. Bleistiftanspitzer


Sehen Sie sich das Profil von Dorfy an!   Senden Sie eine Private Message an Dorfy  Schreiben Sie einen Gästebucheintrag für Dorfy

Beiträge: 893
Registriert: 21.07.2006

AutoCad2007, ProE, HiCad

erstellt am: 24. Mrz. 2010 11:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Bin zwar nicht Andreas...

aber probier mal in der Sub  "mk_substr_list"
(<= (setq start (+ (nth...

------------------
Mfg Heiko

Elefantenjagd in Afrika
"... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..."   (www.uni-leipzig.de/~rotheh/elefant.htm)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 24. Mrz. 2010 12:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Dorfy,
jetzt hab ich es! Das war das fehlende Teil!
Vielen Dank allen, die mir geholfen haben! Ich hoffe jetzt schaff ich es!
Grüße Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas Kraus
Mitglied
Elektrotechniker


Sehen Sie sich das Profil von Andreas Kraus an!   Senden Sie eine Private Message an Andreas Kraus  Schreiben Sie einen Gästebucheintrag für Andreas Kraus

Beiträge: 1162
Registriert: 11.01.2006

WIN 10
ACAD 2017

erstellt am: 24. Mrz. 2010 12:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Super aufgepasst Heiko !!!

Das werd ich doch gleich mal korrigieren

------------------
Gruß
Andreas

http://kraus-cad.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 12. Apr. 2010 16:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!
Leider gab es eine kleine Pause und ich bin jetzt erst wieder akti geworden!
Ich habe noch ein Problem mit der Startposition der Texte:
Immer wenn ich an erster Position nur einen Buchstaben habe, dann bekomme ich diesen nicht mit aufgeführt!
(setq txt "A1.2 sa1.1 abc2")
(mapcar 'car (wcmatch_pos txt (substr (apply 'strcat (mapcar '(lambda (dummy) (strcat ",*" dummy "*") ) (zerlege_text txt filter 2))) 2))))

Dann ist meine Rückgabeliste: (4 10 15)

Vielleicht stelle ich mich ein wenig blöd an, aber ich verändere die Zahlen immer und möchte diese nun in den eigentlichen Textstring zurückbringen und dort gegen die alten austauschen. Ich hoffe ihr seht den Fehler!
Vielen Dank!

Grüße Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Andreas Kraus
Mitglied
Elektrotechniker


Sehen Sie sich das Profil von Andreas Kraus an!   Senden Sie eine Private Message an Andreas Kraus  Schreiben Sie einen Gästebucheintrag für Andreas Kraus

Beiträge: 1162
Registriert: 11.01.2006

WIN 10
ACAD 2017

erstellt am: 12. Apr. 2010 17:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hm - stimmt.

Hab das mal korigiert und die Funktion zerlege_text erweitert.
Jetzt bekommst du mit:

(mapcar 'car (zerlege_text txt filter 5))

das was du brauchst.

(defun zerlege_text (text filter rückgabe)
;;;  sucht alle kleinstmöglichen Teilstrings auf die der Suchfilter noch zutrifft,
;;;  zerlegt den String an diesen Stellen
;;;  gibt eine Liste mit Teilstrings zurück
;;;
;;;  Die mit dem Suchfilter gefundenen Teilstrings werden bei:
;;; - rückgabe=0 nicht entfernt
;;; - rückgabe=1 entfernt
;;; - rückgabe=2 zurückgegeben
;;; - rückgabe=3 Daten für Befehl substr entsprechend rückgabe 0
;;; - rückgabe=4 Daten für Befehl substr entsprechend rückgabe 1
;;; - rückgabe=5 Daten für Befehl substr entsprechend rückgabe 2
;;;
;;;  Die Teilstrings werden durch eine Suchmuster ermittelt dessen Aufbau unter "wcmatch" nachzulesen ist
;;;  Beispiele für filter
;;;    (setq filter "*#`.#*")
;;;    (setq filter "*[~0-9]*")
;;;    (setq filter "*[~0123456789`,]*")
;;;    (setq filter "*#`.?*")
;;;    (setq filter "*`,#*")
;;;
;;;  benötigt werden die Unterfunktionen : mk_substr_list, wcmatch_pos

  (if (wcmatch text filter)
    (progn
      (cond
        ((= rückgabe 0)
         (mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
                 (mk_substr_list text filter)
         )
        )
        ((= rückgabe 1)
         (mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
                 (wcmatch_pos text filter)
         )
        )
        ((= rückgabe 2)
         (mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
                 (vl-remove-if '(lambda (data) (member data (wcmatch_pos text filter))) (mk_substr_list text filter))
         )
        )
((= rückgabe 3)
         (mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
                 (mk_substr_list text filter)
         )
        )
        ((= rückgabe 4)
         (mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
                 (wcmatch_pos text filter)
         )
        )
        ((= rückgabe 5)
         (mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
                 (vl-remove-if '(lambda (data) (member data (wcmatch_pos text filter))) (mk_substr_list text filter))
         )
        )
      )
    )
  )
)

------------------
Gruß
Andreas
http://kraus-cad.de

[Diese Nachricht wurde von Andreas Kraus am 12. Apr. 2010 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 119
Registriert: 14.09.2005

HP Book
Intel Core i7 2,9GHz
32GB RAM
Nvidia Quadro M2200
Windows 10 Pro
AutoCAD 2018

erstellt am: 16. Apr. 2010 08:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Andreas!
Vielen Dank für die Anpassung nun bekomme ich alles was ich benötige! Jetzt brauch ich nur noch ein wenig Zeit und mein Programm wird laufen.
Grüße Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2020 CAD.de | Impressum | Datenschutz