| |
| 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: Zahlen aus string exportieren (1438 / mal gelesen)
|
jomann999 Mitglied Bauing
Beiträge: 9 Registriert: 12.01.2016 Windows 10, Acad
|
erstellt am: 14. Feb. 2016 20:13 <-- editieren / zitieren --> Unities abgeben:
Hallo liebes CAD Forum, ich habe eine Frage, und zwar: Ich möchte gerne Zahlen aus einer Textzeile exportieren. D.h. Buchstaben oder nicht-Zahlen sollen entfernt werden. Und zwar aus der mit dem acad Befehl masseig erzeugten *.mpr datei. In einer lisp funktion habe ich die Datei schon geöffnet und für jede text-Zeile eine Variable vergeben (Var Zeile1). " (setq i 1) (while (< i 20) (set (read (strcat "Zeile" (itoa i))) (read-line mprdat)) (setq i (1+ i)) ) (close mprdat) " Man kann nun mit (vl-string-search (argument) (argument)) für eine/jede Zeile die Position von einem textzeichen ermitteln was vor der Zahl steht und dann mit den Befehlen substr und atof diese Zahlenziffern in Variablen abspeichern. So z.B.: " (setq varzahl (atof (substr Zeile4 56))) Allerdings ist das eher mühsam. gibt es nicht eine funktion die überprüft ob eine Zahl im der Zeile (bzw String) vorhanden ist und diese entfernt? Vielleicht hat jemand eine idee. Vielen Dank Till Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 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: 15. Feb. 2016 07:44 <-- editieren / zitieren --> Unities abgeben: Nur für jomann999
Hallo Till, wenn man in einer Zeile von EINER Zahl mit EINEM Punkt als Dezimaltrennzeichen ausgeht, dann könnte man mit folgendem Code diese Zahl herausziehen: Code:
(defun c:test ( / LISTE RETLISTE STR) (setq str "sdfsdfer123.123sdfsdfsd" liste (vl-string->list "1234567890.")) (if (setq RetListe (vl-remove-if '(lambda(X) (not(member X liste))) (vl-string->list str))) (atof(vl-list->string RetListe))))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 15. Feb. 2016 08:06 <-- editieren / zitieren --> Unities abgeben: Nur für jomann999
|
jomann999 Mitglied Bauing
Beiträge: 9 Registriert: 12.01.2016 Windows 10, Acad
|
erstellt am: 16. Feb. 2016 19:31 <-- editieren / zitieren --> Unities abgeben:
Hallo, naja ich brauche die flächenträgheitsmomente (mit und ohne steiner anteil), schwerpunkt, und fläche. Kann man meines Wissens mit massprop für beliebige Querschnitte /Geometrie Formen berechnen lassen. Die exportiere ich dann in Excel um damit dann weiterrechnen zu können. Ich brauch einfach ne Funktion, die mir alle Zahlen aus Text exportiert. Auch z.B. sowas: text (-34.232985). Direkter Zugriff auf Flächenträgheitsmomente ist nicht möglich. Dazu gibt es ja massprop. Vielen Dank Gruß Till Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 16. Feb. 2016 19:49 <-- editieren / zitieren --> Unities abgeben: Nur für jomann999
|
jomann999 Mitglied Bauing
Beiträge: 9 Registriert: 12.01.2016 Windows 10, Acad
|
erstellt am: 16. Feb. 2016 21:22 <-- editieren / zitieren --> Unities abgeben:
|
jomann999 Mitglied Bauing
Beiträge: 9 Registriert: 12.01.2016 Windows 10, Acad
|
erstellt am: 19. Feb. 2016 23:42 <-- editieren / zitieren --> Unities abgeben:
Hi, habe jetzt eine eigene Funktion gebastelt. (Allerdings eher anfängermäßig :-)) (defun zex (String) (if (wcmatch String "*##.#*" )(zexp2 String) ;else if wcmatch (princ "keine Zahl im String") ));end if, end defun (defun zexp2 ( String / ergebnis i j ) (setq strlength (strlen String)) (setq i 1) (setq j 1) (while (< i strlength) (setq ergebnis (atof String)) (if (= ergebnis 0.0) (progn (setq String (substr String 2)) (princ (strcat "\n" String)) ) ;close progn ;else if Ergebnis \=0 (progn ;(princ (strcat "\nrest=" String)) (setq String (vl-string-left-trim " " String)) ;(princ (strcat "\nrest_ohne_leerzeichen=" String)) (princ (strcat "\n" "ergebnis=" (rtos ergebnis 2 4))) (set (read(strcat "Zahl" (itoa j))) Ergebnis) (setq lenErgebnis (1+ (strlen (rtos ergebnis 2 7)))) ; (princ (strcat "\n" "lenergebnis +1= " (itoa lenErgebnis))) (setq String (substr String lenergebnis)) (setq j (1+ j)) ) ;close progn ) ;close if (setq i (1+ i)) );end while < string strlength (princ (strcat "\nexportierte Zahlen:" (itoa (1- j)))) (print) );end defun Habe aber diese hier gefunden, von Wolfgang Sünder: Sie funzt aber bei mir noch nicht wirklich. ACAD 2015. Ist die noch aktuell? Funzt die bei jemandem? Bzw. ist ein Fehler im 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 ) Danke G. Till
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 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: 20. Feb. 2016 11:23 <-- editieren / zitieren --> Unities abgeben: Nur für jomann999
Hallo Till, Deinen Code bin ich nicht im einzelnen durchgegangen, und Wolfgang's Code ist bei mir im Test in eine Endlos-While-Schleife gegangen. Aber auch Wolfgang hat sich für die Untersuchung der Zeichenkette die Funktion VL-STRING->LIST zu nutze gemacht. Diese finde ich vorteilhaft, weil man nicht mit SUBSTR und Positionserkennung usw. arbeiten muss, sondern nur mit den Charactercodes für jedes einzelne Zeichen. z.B. ergibt die Zeichenfolge "ab1a" mit der Funktion VL-STRING->LIST (97 98 49 97). D.h., jedes Zeichen hat seinen eigenen Code. Wenn ich jetzt in der Liste eine Zahl suche kann ich die mit der MEMBER-Funktion und dem Zahlencode für die "1" = 49 finden. Hier nochmal meine finaler Code, bitte mal durch-debuggen (Visual-LISP-Editor => http://www.bosse-engineering.com/JB_Data/Bosse-engineering/090501_VisualLISP-Editor.pdf ), die Variablennamen sollten den Code ausreichend erklären:
Code:
(defun c:test1 ( / ) (ZahlenAusString "sdfasdfsd12.12dafsdf-13.13safs" 'T 'T) ) ;;;Gültige Zahlen: mit Komma getrennt und mit negativem Vorzeichen ;;;=> (12.0 12.0 -13.0 13.0)(defun c:test2( / ) (ZahlenAusString "sdfasdfsd12.12dafsdf-13.13safs" nil nil) ) ;;;Gültige Zahlen: mit Punkt getrennt und ohne negativem Vorzeichen ;;;=>(12.12 13.13) (defun c:test3( / ) (ZahlenAusString "sdfasdfsd12,12dafsdf-13,13safs" 'T 'T) ) ;;;Gültige Zahlen: mit Komma getrennt und mit negativem Vorzeichen ;;;=>(12.12 -13.13) (defun c:test4( / ) (ZahlenAusString "sdfasdfsd12,12dafsdf-13,13safs" nil 'T) ) ;;;Gültige Zahlen: mit Punkt getrennt und mit negativem Vorzeichen ;;;=>(12.0 12.0 -13.0 13.0) (defun ZahlenAusString (string KommaFlag NegativesVorzeichenFlag / CHARACTERCODE GUELTIGFLAG LISTEGUELTIGERZEICHENALSCHARACTERCODE LISTESTRINGALSCHARACTERCODE RESULTLIST RESULTSUBLIST X) (setq listeGueltigerZeichenAlsCharacterCode (apply 'append (list(vl-string->list "1234567890") (if KommaFlag (vl-string->list ",") (vl-string->list ".")) (if NegativesVorzeichenFlag (vl-string->list "-") ) ) ) listeStringAlsCharacterCode (vl-string->list string))
(mapcar '(lambda(CharacterCode) (if (member CharacterCode listeGueltigerZeichenAlsCharacterCode) (if GueltigFlag (setq ResultSubList (cons CharacterCode ResultSubList)) (setq GueltigFlag 'T ResultSubList (cons CharacterCode ResultSubList)) ) (if GueltigFlag (setq ResultList (cons (reverse ResultSubList)ResultList) ResultSubList nil GueltigFlag nil)))) listeStringAlsCharacterCode) (if ResultSubList (setq ResultList (cons (reverse ResultSubList)ResultList))) (princ (strcat "\n" string "\n")) (mapcar '(lambda(X) (atof(vl-string-subst "." "," (vl-list->string X))) ) (reverse ResultList)) )
viel Spaß beim ausprobieren ------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jomann999 Mitglied Bauing
Beiträge: 9 Registriert: 12.01.2016 Windows 10, Acad
|
erstellt am: 21. Feb. 2016 17:17 <-- editieren / zitieren --> Unities abgeben:
Hi, :-), super, Vielen Dank. Funktioniert sehr gut. Da muss ich aber noch ein bischen was dazulernen. Wird noch ein bischen dauern, den Code vollständig zu verstehen. Allerdings: Zahlen mit : 0.000 werden nicht erkannt. Das ist ein bischen Schade. Allerdings kann ich da noch ein bischen rumtüfteln und kriegs vielleicht hin. Aber meine Zahlenexport-Funktion funktioniert auch gut. Es wird in einer While Schleife immer die Fun atof auf den String angewand. Wenn diese zu 0.0 evaluert wird mit substr das 1. Zeichen aus dem String entfernt. Ist atof ungleich 0.0 wird eine Ergebnisvariable in eine Liste angehängt,( oder eine Variable erstellt). Läuft auch schnell genug. Zum Schluss: Vielen Dank für die Hilfe. Ohne Hätte ich das nicht geschafft. Das hat Spass gemacht. V.G. Till
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |