| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Zahl (en) in einem Textstring herausfinden (2379 mal gelesen)
|
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 22. Mrz. 2010 14:57 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 22. Mrz. 2010 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
|
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 22. Mrz. 2010 16:07 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 22. Mrz. 2010 16:23 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
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
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 23. Mrz. 2010 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
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
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 24. Mrz. 2010 08:33 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 133 Registriert: 14.09.2005 HP ZBook Intel Core 12.Gen i7 2,3GHz 32GB RAM Windows 11 Pro AutoCAD 2024
|
erstellt am: 24. Mrz. 2010 09:37 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 24. Mrz. 2010 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
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
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 24. Mrz. 2010 12:06 <-- editieren / zitieren --> Unities abgeben:
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 24. Mrz. 2010 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
|
Big Sven Mitglied Techn. Angestellter
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 12. Apr. 2010 16:49 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 12. Apr. 2010 17:28 <-- editieren / zitieren --> Unities abgeben: Nur für Big Sven
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
Beiträge: 133 Registriert: 14.09.2005
|
erstellt am: 16. Apr. 2010 08:05 <-- editieren / zitieren --> Unities abgeben:
|