Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Zahlen aus string exportieren

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
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Zahlen aus string exportieren (1363 / mal gelesen)
jomann999
Mitglied
Bauing

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

Beiträge: 9
Registriert: 12.01.2016

Windows 10, Acad

erstellt am: 14. Feb. 2016 20:13    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 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


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 15. Feb. 2016 07:44    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 jomann999 10 Unities + Antwort hilfreich

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 15. Feb. 2016 08: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 Nur für jomann999 10 Unities + Antwort hilfreich

Servus.

Zahlen:

hier meine GoogleAnfrage:
site:Cad.de Forum145 String Zahlen

Beispieltreffer:
http://ww3.cad.de/foren/ubb/Forum145/HTML/001480.shtml
http://ww3.cad.de/foren/ubb/Forum145/HTML/001287.shtml
http://ww3.cad.de/foren/ubb/Forum145/HTML/002546.shtml
http://ww3.cad.de/foren/ubb/Forum145/HTML/002615.shtml

-

pro Zeile eine Variable

Du kannst natürlich auch mehr mit LISten Probieren:
(progn
(setq mprdat (open (if FILE FILE (setq FILE (getfiled "" "" "" 8))) "r"))
(while (setq lstr (read-line mprdat))
  (setq MPRasLIST (cons lstr MPRasLIST))
)
(close mprdat)
)
; mit NTH greifst du auf die einzelnen zu.

Abgesehen davon das es ausgerechnet zu MASSPROP bereits Lispcode geben wird (aber dabei lernt man ja weniger), Vorschlag:
Ein Funktion schreiben welche alle Werte ermittelt und in einer Assoc-Liste bereitstellt.
Diese Funktion ist dann so allgemein das man sie "für alles" verwenden kann hinsichtlich der Auswertlung von mpr,
vielleicht wahlweise als deutsche und englische AssocListe.

(("Masse" . 55.3)("Volumen" . 55.3)("Begrenzungsrahmen" . ((113.04 126.77)(28.56 40.98)(-5.05 5.05)))....)


Allerdings wäre meine erste Frage an mich selbst: Ist das nötig?
Habe ich nur eine mpr?
Oder habe ich die Objekte im CAD im Zugriff und komme ich nicht ggf direkt(er) an die Werte heran die ich benötige? WELCHE Werte sind denn benötigt?
Stehen sie als DXF-Wert zur Verfügung oder als sind sie als Eigenschaft abrufbar oder zu berechnen?

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

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

jomann999
Mitglied
Bauing

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

Beiträge: 9
Registriert: 12.01.2016

Windows 10, Acad

erstellt am: 16. Feb. 2016 19:31    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,

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 16. Feb. 2016 19: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 Nur für jomann999 10 Unities + Antwort hilfreich

Zu String und Zahlenwerte extrahieren sind oben bereits Links gepostet, zudem hast du selbst ja auch schon was geschafft, alles zusammen sollte zum Ziel fühhren?!

Noch weitere Links, weniger grundlegend aber passend zum Thema und vielleicht hilfreich für dich:
http://forum.cad.de/foren/ubb/Forum54/HTML/028534.shtml
http://forum.cad.de/foren/ubb/Forum145/HTML/004115.shtml

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

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

jomann999
Mitglied
Bauing

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

Beiträge: 9
Registriert: 12.01.2016

Windows 10, Acad

erstellt am: 16. Feb. 2016 21:22    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,

ja,
vielen Dank für die Links und Anregungen.
Das ging mal wieder total fix. :-)

Schönen Abend euch,
Grüße
Till

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

jomann999
Mitglied
Bauing

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

Beiträge: 9
Registriert: 12.01.2016

Windows 10, Acad

erstellt am: 19. Feb. 2016 23:42    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

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


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 20. Feb. 2016 11: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 jomann999 10 Unities + Antwort hilfreich

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

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

Beiträge: 9
Registriert: 12.01.2016

Windows 10, Acad

erstellt am: 21. Feb. 2016 17:17    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

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

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)2023 CAD.de | Impressum | Datenschutz