| |
| 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: String Zerlegung Buchstaben/Zahlen (2871 mal gelesen)
|
RSt-Stahl Mitglied
Beiträge: 79 Registriert: 08.07.2005 ACAD 2006 AMD Athlon XP +4800 X2 1,5 GB Ram 500 GB HD ATI Radeon XT1900
|
erstellt am: 06. Sep. 2007 11:14 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes Forum, ich suche nach einer Funktion mit der ich in Variablen gespeicherte Werte Splitten kann in "Worte" und "Zahlen". Ich habe z.B. den String "Horst2005" in einer Variablen und möchte diesen gerne aufteilen in "Horst" und in "2005". Das Problem was ich habe ist das die "Worte" unterschiedlich lang sind, ich kann also nicht immer nach dem 5 Zeichen abschneiden bzw. die ersten 5 einlesen. Gibt es eine Möglichkeit das die Strings "erkannt" werden? Vielen Dank im Voraus. Thomas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 06. Sep. 2007 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 06. Sep. 2007 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Zitat: Original erstellt von tunnelbauer: Ist der Rest immer gleich lang (also die Zahl) ?
Mensch Thomas. Nur 'ne universelle Funktion, ist eine gute Funktion .. das solltest du doch nach Lektüre des Autolisp-Kochbuches wissen ------------------ - 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 |
RSt-Stahl Mitglied
Beiträge: 79 Registriert: 08.07.2005 ACAD 2006 AMD Athlon XP +4800 X2 1,5 GB Ram 500 GB HD ATI Radeon XT1900
|
erstellt am: 06. Sep. 2007 11:28 <-- editieren / zitieren --> Unities abgeben:
Hallo Tunnelbauer, schon mal danke für deine Antwort, nein die Zahlen sind entweder 2 oder 3 stellig! aber evtl. könnte ich vor die 2 stelligen eine "0" einfügen damit sie gleichlang wären.... Vielleicht hilft es aber, das ich im voraus weiß das es 12 verschiedene "Wörter" sein können.... Gruß Thomas
[Diese Nachricht wurde von RSt-Stahl am 06. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 06. Sep. 2007 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Hallo Thomas, hab' da eine Funktion, die aus einem String ungültige Zeichen entfernt: Code: (defun str-delete (string letterliste / ) (setq i 1 return "") (repeat (strlen string) (or (member (setq letter (substr string i 1)) letterliste) (setq return (strcat return letter))) (setq i (1+ i)) ) return )
string ist der Text, letterliste die "verbotenen" Zeichen. Z.B. (str-delete "Horst2005" '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0")) -> "Horst" vielleicht kannst Du sie ja ausbauen...Grüsse, Henning ------------------ VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de [Diese Nachricht wurde von wronzky am 06. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSt-Stahl Mitglied
Beiträge: 79 Registriert: 08.07.2005 ACAD 2006 AMD Athlon XP +4800 X2 1,5 GB Ram 500 GB HD ATI Radeon XT1900
|
erstellt am: 06. Sep. 2007 11:44 <-- editieren / zitieren --> Unities abgeben:
Hallo Wronzky, vielen Dank für die Mühe! werde deine Funktion direkt mal einbauen! sieht sehr gut aus! vielen dank! Da ich wie gesagt weiß welche "Buchstaben" ich entfernen muss ist deine Funktion Ideal für meinen Zweck. Unities sind unterwegs! Gruß Thomas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 06. Sep. 2007 11:48 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Fürs Trennen an der Stelle, an der das erste Mal ne Ziffer auftaucht : (defun DT:STR-DIV-SET(STRING SEPARATOR / LISTE OFFSET POS ) (if(=(type STRING) 'STR) (if(and(=(type SEPARATOR) 'LIST) (setq SEPARATOR (vl-remove-if-not'(lambda(x)(=(type X)'Str)) SEPARATOR)) (setq LISTE (vl-remove-if-not '(lambda(y)(numberp(car y))) (mapcar 'cons (mapcar'(lambda(x)(vl-string-search x STRING))SEPARATOR) SEPARATOR ) ) ) ) (progn (setq SEPARATOR (cdr(assoc (apply 'min (mapcar 'car LISTE)) LISTE))) (if(setq POS (vl-string-search SEPARATOR STRING)) (list (substr STRING 1 POS)(substr string (1+ POS) )) (list STRING) ) ) STRING ) STRING ) ) (DT:STR-DIV-SET "HORST2005" '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")) -> ("HORST" "2005") ------------------ - 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 |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 06. Sep. 2007 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Ich mache sowas immer mit Regular Expressions (setq RegEx (vlax-create-object "vbscript.regexp")) (vlax-put regex "Global" :vlax-true) (vlax-put regex "Pattern" "[^a-zA-Z]") (setq AlleBuchstaben (vlax-invoke regex "Replace" "dhuzt8n94nt934ghnxz3489zn89v8nxdz8934nz9" "")) ;-> dhuztnntghnxzznvnxdznz (vlax-put regex "Pattern" "[^0-9]") (setq AlleZahlen (vlax-invoke regex "Replace" "dhuzt8n94nt934ghnxz3489zn89v8nxdz8934nz9" "")) ;-> 894934348989889349 (vlax-release-object RegEx) ------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC
[Diese Nachricht wurde von fuchsi am 06. Sep. 2007 editiert.] [Diese Nachricht wurde von fuchsi am 06. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSt-Stahl Mitglied
Beiträge: 79 Registriert: 08.07.2005 ACAD 2006 AMD Athlon XP +4800 X2 1,5 GB Ram 500 GB HD ATI Radeon XT1900
|
erstellt am: 06. Sep. 2007 12:10 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank CADmium, wirklich toll wie schnell und kompetent man hier im Forum Antwort bekommt! Habe mir deine Funktion abgespeichert und werde sie mir später genau ansehen! Unities sind unterwegs. Vielen Dank, Gruß Thomas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 06. Sep. 2007 12:14 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Hallo, na sowas macht doch Spaß, ich habe dafür mal "wcmatch" mit "@" und "#" verwendet: Code:
(defun c:horst (/ string liste) (setq string "HORST2005") (setq liste (horst:string:->list string)) (list (horst:liste:remove_if_wcmatch:->string "#" liste) (horst:liste:remove_if_wcmatch:->string "@" liste)))(defun horst:string:->list (string /) (mapcar 'vl-list->string (mapcar 'list (vl-string->list string)))) (defun horst:liste:remove_if_wcmatch:->string (pattern liste / A) (apply 'strcat (vl-remove-if '(lambda (A) (wcmatch A pattern)) liste)))
Die Funktion trennt dann aber nicht an einer bestimmten Position, sondern Zeichen für Zeichen, z.B. HORST2005a => (HORSTa 2005) PS: und das Kochbuch ist wirklich klasse. ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 06. Sep. 2007 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Zitat: Original erstellt von fuchsi: Ich mache sowas immer mit Regular Expressions ...
Jo, kommt auch cool. Zitat: Original erstellt von joern bosse: Hallo, na sowas macht doch Spaß, ich habe dafür mal "wcmatch" mit "@" und "#" verwendet....
.. schön, dass so viele Wege nach Rom führen .. ------------------ - 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 |
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 06. Sep. 2007 14:08 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Hi, hab' auch noch einen. vl-string-trim kommt mit den gleichen Argumenten wie wcmatch klar. Deshalb auf die Schnelle:
Code:
(defun mx:SplitHotte (hotte / result) (mapcar '(lambda (excl) (setq result (cons (vl-string-trim excl hotte) result)) ) (list "[0123456789]" "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]" ) ) (reverse result) )
->("Hotte" "2005")[Edit: In eine Funktion gepackt] Gruß CADchup ------------------ CADmaro.de
[Diese Nachricht wurde von CADchup am 06. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wolfgang S Mitglied CADaver
Beiträge: 270 Registriert: 06.03.2006 AC 2009, C3D 2009, AC 2010, C3D 2010, AC 2011, C3D 2011, RVT 2010, RVT 2011, ASD 2011 und alles darunter bis R14 + Win XP, Win XP64, Win 7/64
|
erstellt am: 07. Sep. 2007 07:33 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
... und um mit der ermittelten Zahl auch was anzufangen wär nicht schlecht ein Minus (-) oder ein Komma "." oder Tausender-Trennzeichen "," davor/dazwischen zu erkennen. Wobei ja "-" "." "," als Text wieder nicht Teil eines Pattern wie z.B. "[^0-9]" wäre. hab die funktionen nicht durchprobiert, aber es scheint bis jetzt so, daß es nicht darum geht die Zahl weiterzuverwenden sondern den Text zu säubern! das Ziel der Aktion war aus dem Originalpost aber nicht abzuleiten. Bleibt dann bei Texttrennung von "FBOK=-0.13" übrig "FBOK=-." (soweit ich die Funktionen durchüberlegt habe, wie gesagt)
ein grübelnder Wolfgang S
[Diese Nachricht wurde von Wolfgang S am 07. Sep. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSt-Stahl Mitglied
Beiträge: 79 Registriert: 08.07.2005 ACAD 2006 AMD Athlon XP +4800 X2 1,5 GB Ram 500 GB HD ATI Radeon XT1900
|
erstellt am: 07. Sep. 2007 10:14 <-- editieren / zitieren --> Unities abgeben:
Hallo und Danke noch mal an alle die eine Lösung parat hatten. Ich werde mir alle Vorschläge noch mal in Ruhe anschauen. @Wolfgang S. Es werden sowohl Text als auch Zahl weiterverarbeitet. Das ganze wird eine "Profil" Erkennung. Beim zeichnen von Profilen werden die Daten via XDaten angehangen (z.B. IPE80) und nachher bei der Weiterverarbeitung wird der Profilname und die Größe wieder ausgelesen! Ebenso der Maßstab des Profils. So kann ich gezielt Informationen über das Profil erhalten ohne das ich jedes Mal angeben muss um welches Profil es sich handelt, erspart dem Nutzer (mir) eine menge an unnötiger Angaben. Auf diese Weise werden nachher „DAST“-Platten bzw. Stahlbaurippen passgenau eingefügt. Klappt schon ganz gut das ganze. Außerdem kann man die Funktion so „einstellen“ das aus „FBOK=0.13“ nur „FBOK“ und „0.13“ übrig bleiben! Gruß Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wolfgang S Mitglied CADaver
Beiträge: 270 Registriert: 06.03.2006 AC 2009, C3D 2009, AC 2010, C3D 2010, AC 2011, C3D 2011, RVT 2010, RVT 2011, ASD 2011 und alles darunter bis R14 + Win XP, Win XP64, Win 7/64
|
erstellt am: 07. Sep. 2007 11:08 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Hallo! hab mal was überlegt, das zerteilt die Strings in Zahlen, ist aber nicht fertig. Vor allem die rekursive Rückgabe der richtigen Werte passt noch nicht. Aber die Aufteilung der Zahlen passt schon!
Code: (defun text2zahl (String / stringlist restlist TMP_LIST ZAHLENLIST idx) (if (= (type string) 'STR) (setq stringlist (vl-string->list String)) (setq stringlist string) ) (setq restlist stringlist zahlenlist (vl-string->list "1234567890+-.,") ) (setq idx 0) (while (member (nth IDX stringlist) zahlenlist) (setq tmp_list (append tmp_list (list (nth IDX stringlist))) restlist (cdr restlist) idx (1+ idx) ) );end_while (list (vl-list->string tmp_list)(if (cdr restlist) (text2zahl (cdr restlist)) )) )
Bsp: (text2zahl "FBOK=-0.26 -123,513.50 +67") ergibt: ("" ("" ("" ("" ("" ("-0.26" ("-123,513.50" ("+67" nil)))))))) (wie gesagt, die Rückgabe is nicht ok) lg Wolfgang S
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1766 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 07. Sep. 2007 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Hallo Wolfgang, ich habe Deine Version nochmal anders geschrieben, ohne Rekursion, dafür mit 3x "while" Code:
(defun text2zahl (String / LISTE RESTLIST TEMP ZAHLENLIST ) (setq restlist (vl-string->list string) zahlenlist (vl-string->list "1234567890+-.,")) (while restlist (while (not(member(car restlist)zahlenlist)) (setq restlist (cdr restlist))) (while (member (car restlist)zahlenlist) (setq temp (cons (car restlist)temp) restlist (cdr restlist))) (if temp (setq liste (cons (vl-list->string(reverse temp))liste) temp nil))) (reverse liste))
------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wolfgang S Mitglied CADaver
Beiträge: 270 Registriert: 06.03.2006 AC 2009, C3D 2009, AC 2010, C3D 2010, AC 2011, C3D 2011, RVT 2010, RVT 2011, ASD 2011 und alles darunter bis R14 + Win XP, Win XP64, Win 7/64
|
erstellt am: 07. Sep. 2007 13:05 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
|
Wolfgang S Mitglied CADaver
Beiträge: 270 Registriert: 06.03.2006 AC 2009, C3D 2009, AC 2010, C3D 2010, AC 2011, C3D 2011, RVT 2010, RVT 2011, ASD 2011 und alles darunter bis R14 + Win XP, Win XP64, Win 7/64
|
erstellt am: 08. Sep. 2007 21:40 <-- editieren / zitieren --> Unities abgeben: Nur für RSt-Stahl
Code:
;;; ____________________________________________________________ ;;; | ;;; | - Zerlegen von Textstrings in vorkommende Zahlenwerte ;;; |____________________________________________________________ ;;; | ;;; | Aufruf: (text2zahl [String] [FLAG]) ;;; | ;;; | Eingangswerte: Textstring zum Zerlegen ;;; | Flag T -> Komma wird als Trennung ;;; | zwischen Zahlen angesehen ;;; | NIL -> Komma als Tausendertrennung ;;; | ;;; | Ausgangswerte: Liste mit allen vorkommenden Zahlen ;;; | ;;; | Beispiel: ;;; | (text2zahl "ASDF 130,232.54564656 -25" T) liefert: ;;; | -> (130233.0 -25) ;;; | (text2zahl "ASDF 130,232.54564656 -25" nil) liefert: ;;; | -> (130 232.546 -25) ;;; | ;;; | - Wolfgang Sünder ;;; | - Version 1.0 ;;; | - Sept 2007 ;;; | ;;; |____________________________________________________________ ;;; (defun text2zahl (String KOMMAFlAG / LISTE RESTLIST TEMP ZAHLENLIST) (setq restlist (vl-string->list string) zahlenlist (append (vl-string->list "1234567890+-.") (if KOMMAFLAG (vl-string->list ",") ) ) ) (while restlist (while (not (member (car restlist) zahlenlist)) (setq restlist (cdr restlist)) ) (while (member (car restlist) zahlenlist) (setq temp (cons (car restlist) temp) restlist (cdr restlist) ) ) (if temp (setq liste (cons (if KOMMAFLAG (vl-string-subst "" "," (vl-list->string (reverse temp)) ) (vl-list->string (reverse temp)) ) liste ) temp nil ) ) ) (mapcar 'read (reverse liste) ) ;;;mit read in Zahlen umwandeln, Int oder Real wird von read selektiert )
hier das Endergebnis. mit Flag für Kommaunterscheidung, und danke allen Beteiligten für die UnterstützungWolfgang S Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |