| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Listen exportieren (1908 mal gelesen)
|
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 04. Feb. 2004 12:22 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle. Man kann ja bekanntlich Daten in eine externe Datei abspeichern: (setq dat (open "c:\\test.DAT" "w")) .... Wenn diese wieder gelesen werden, werden diese als Texte erkannt: (setq dat (open "c:\\test.DAT" "r")) (setq P (read-line dat)) z.B P= "Text" oder "1" Gibt es nun noch eine andere Möglichkeit Listen abzuspeichern ohne jeden einzelnen Listenposten in eine separate Zeile zu schreiben. Wenn man eine komplette Liste abspeichert entsteht sowas: (setq dat (open "c:\\test.DAT" "w")) (setq h (list "test1" "test2")) (princ h dat) (close dat) (setq dat (open "c:\\test.DAT" "r")) (setq P (read-line dat)) (close dat) Ergebnis: P= "(test1 test2)" anstatt p= ("test1" "test2") Ich weiß das es mit den einzelnen abspeichern auch klappt und auch relativ einfach geht. Dachte nur da gibts vielleicht was besseres. Martin
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 04. Feb. 2004 12:31 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Hi Martin, das geht, und ich nutze diese Form hauptsächlich um Daten rauszuschreiben, die ich irgendwann wieder im LISP brauche. Ist auch ganz einfach: Du schreibst den LISP-Ausdruck mit write-line in die ASCII-Datei. Die kann irgendweine Dateierweiterung haben. Mit (setq dateiinhalt (load "beispiel.bsp")) bekommst du direkt die List ohne umständlich mit read-line arbeiten zu müssen. Der Inhalt der beispiel.bsp könnte dann in etwa so aussehen: '(;Achtung das ' (Quote-Zeichen) nicht vergessen ("WERT_1" . "Hallo") ("WERT_2" . "Du") ("WERT_3" . "da!") ) Anwendung: (setq dateiinhalt (load "beispiel.bsp")) (princ (mapcar 'cdr dateiinhalt)) ;oder (setq wert1 (cdr(assoc "WERT_1" dateiinhalt))) Bei Fragen ... Grüße Holger
------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Speedcad Mitglied
Beiträge: 76 Registriert: 17.01.2004
|
erstellt am: 04. Feb. 2004 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
(setq dat (open "c:\\test.DAT" "w")) (setq h (list "test1" "test2")) (princ h dat) (close dat) (setq dat (open "c:\\test.DAT" "r")) (setq P (read (read-line dat))) (close dat) so geht's bestimmt Gruß Speedcad Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 04. Feb. 2004 13:14 <-- editieren / zitieren --> Unities abgeben:
An Brischke: Mit write-line schreiben? (setq h (list "test1" "test2")) (write-line h dat) ; Fehler: Fehlerhafter Argumenttyp: stringp ("test1" "test2") An Speedcad: Ergebnis ist (test1 test2) nicht ("test1" "test2") Martin
[Diese Nachricht wurde von mkl-cad am 04. Feb. 2004 editiert.]
[Diese Nachricht wurde von mkl-cad am 04. Feb. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 04. Feb. 2004 14:24 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Hallo Martin, du musst alles in die Datei schreiben auch die Klammern und das Quote! entweder mit (princ ..) (setq wert1 "TEST1") (setq wert2 "TEST2") (princ "'(" dat) (princ (if (= 'STR (type wert)) (strcat "\""wert1 "\"") wert) dat) (princ " " dat) (princ (if (= 'STR (type wert)) (strcat "\""wert2 "\"") wert) dat) (princ ")" dat) oder mit (write-line ..), was dann aber nur mit Strings funktioniert. (write-line (strcat "'(\"" wert1 "\" \"" wert2 "\")") dat) Ich finde es mit (princ..) praktischer, weil du dann nicht alle möglichen Umwandlungen in einen String machen musst. Nur eben dem String die "" mitgeben. Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 04. Feb. 2004 14:51 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Antwort Aber da bleib ich lieber bei meiner bisherigen Methode jeden Wert der Liste mittels einer Schleife in die Datei zu schreiben und beim lesen mittels einer Schleife wieder zu einer Liste zusammen zu fügen. Ich brauche wenn dann sowieso die ganze Liste und nicht nur einzelne Werte daraus. Dann würde ich Ihre Methode beforzugen. Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 04. Feb. 2004 15:39 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Hi Martin, ich möchte dir jetzt nicht meine Methode aufdrücken, aber zeigen wie einfach es eigentlich ist. Deswegen ein Beispiel:
Code:
(defun c:xxx (/ w1 w2 w3 inDateiListe meineListeAusDatei) (setq w1 1 w2 1.1 w3 "Hallo" inDateiListe (list w1 w2 w3) ) ;;Daten wegschreiben (w:list->File "c:\\datei.txt" inDateiListe) ;und wieder Laden (setq meineListeAusDatei (load "c:\\datei.txt")) ) (defun w:list->File (datei WerteListe / f) (setq f (open datei "w")) (princ "'(" f) (mapcar '(lambda (W) (princ (if (= 'STR (type W)) (strcat "\"" W "\"") W) f ) (princ " " f) ) WerteListe ) (princ ")" f) (close f) )
Bei Fragen ... Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 04. Feb. 2004 16:37 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 04. Feb. 2004 16:42 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 05. Feb. 2004 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Hi, versuch's mal hiermit. Ich denke prin1 ist der Schlüssel: Code:
;;; List = Liste die in File geschreiben werden soll ;;; FULLPATHNAME = Sagt der Name schon... ;;; Beispiel: (LST->FILE (list "Hallo" "Welt" "Test" "1" 2 3 4) "C:\\Temp\\Test.txt") (defun LST->FILE (LST FULLPATHNAME / FDESC) (setq FDESC (open FULLPATHNAME "w")) (prin1 LST FDESC) (close FDESC) lst ) ;_ end of defun;;; FULLPATHNAME = Sagt der Name schon... ;;; Beispiel: (LST-FILE->LST "C:\\Temp\\Test.txt") (defun LST-FILE->LST (FULLPATHNAME / FDESC LINE) (if (findfile FULLPATHNAME) (progn (setq FDESC (open FULLPATHNAME "r") LINE (read (read-line FDESC)) ) ;_ end of setq (close FDESC) ) ;_ end of progn ) ;_ end of if LINE ) ;_ end of defun (defun C:TEST () (setq A (LST->FILE (list "Hallo" "Welt" "Test" "1" 2 3 4) "C:\\Temp\\Test.txt" ) ;_ end of LST->FILE B (LST-FILE->LST "C:\\Temp\\Test.txt") ) ;_ end of setq (equal A B) ) ;_ end of defun
.. ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 05. Feb. 2004 10:43 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Zitat: Original erstellt von marc.scherer: Hi, versuch's mal hiermit. Ich denke prin1 ist der Schlüssel: ...
Hallo, (prin1..) hatte ich bisher noch keine Beachtung geschenkt. Ändert sich aber im Moment. Damit ist dann auch die Frage geklärt, wie man mehrere Listen in eine Datei schreibt. Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 05. Feb. 2004 14:00 <-- editieren / zitieren --> Unities abgeben:
Das mit den mehreren Listen hatte ich mir ein bischen anders gedacht. Aber mit der guten Vorgabe konnte ich es hinkriegen: (defun LST->FILE (FULLPATHNAME LST LST2 LST3 / FDESC) (setq FDESC (open FULLPATHNAME "w")) (prin1 LST FDESC) (princ "\n" FDESC)(prin1 lst2 FDESC) (princ "\n" FDESC)(prin1 lst3 FDESC) (close FDESC) lst lst2 lst3 ) ;_ end of defun (defun LST-FILE->LST (FULLPATHNAME / FDESC ) (if (findfile FULLPATHNAME) (progn (setq FDESC (open FULLPATHNAME "r") LINE (read (read-line FDESC)) LINE2 (read (read-line FDESC)) LINE3 (read (read-line FDESC)) ) ;_ end of setq (close FDESC) ) ;_ end of progn ) ;_ end of if ) ;_ end of defun
(defun C:TEST ( / LINE LINE2 LINE3) (LST->FILE "C:\\Temp\\Test.txt" (list "Hallo" "Welt" "Test" "1" 2 3 4) (list "Hallo2" "Welt2" "Test2" "1a" 5 6 7) (list "Hallo3" "Welt3" "Test3" "2a" 5 6 7) ) ;_ end of LST->FILE (LST-FILE->LST "C:\\Temp\\Test.txt") ;!!! Listen befinden sich nun in LINE LINE2 und LINE3 ) ;_ end of defun Nun sind drei Listen in einer Datei gespeichert. Vielen Dank an alle Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 05. Feb. 2004 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Hi mkl-cad, das ist doch Hühnerkacke :-). Dann schreib das gleich so, das die Anzahl der Listen egal ist: Code:
;;; FULLPATHNAME = Sagt der Name schon... ;;; LST = Listen die in File geschrieben werden sollen ;;; Beispiel: (LST->FILE "C:\\Temp\\Test.txt" (list '("Hallo" "Welt" "Test")'("1" 2 3 4))) (defun LST->FILE (FULLPATHNAME LST / FDESC) (setq FDESC (open FULLPATHNAME "w")) (foreach ELEM LST (prin1 ELEM FDESC) (princ "\n" FDESC) ) ;_ end of foreach (close FDESC) LST ) ;_ end of defun;;; FULLPATHNAME = Sagt der Name schon... ;;; Beispiel: (LST-FILE->LST "C:\\Temp\\Test.txt") (defun LST-FILE->LST (FULLPATHNAME / FDESC LINE RETVAL ZEILE) (if (findfile FULLPATHNAME) (progn (setq FDESC (open FULLPATHNAME "r")) (while (setq zeile (read-line FDESC)) (setq LINE (read ZEILE) RETVAL (cons LINE RETVAL) ) ;_ end of setq ) (setq retval (reverse retval)) (close FDESC) ) ;_ end of progn ) ;_ end of if retval ) ;_ end of defun (defun C:TEST (/ LINE LINE2 LINE3) (equal (LST->FILE "C:\\Temp\\Test.txt" (list (list "Hallo" "Welt" "Test" "1" 2 3 4) (list "Hallo2" "Welt2" "Test2" "1a" 5 6 7) (list "Hallo3" "Welt3" "Test3" "2a" 5 6 7) ) ;_ end of list ) ;_ end of LST->FILE (LST-FILE->LST "C:\\Temp\\Test.txt") ) ;_ end of equal ) ;_ end of defun
.. ------------------ Ciao, Marc 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: 05. Feb. 2004 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
|
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 05. Feb. 2004 14:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Marc hast ja recht. Wollte ich auch eigentlich. Hatte so auf die schnelle aber nicht die richtige Idee. Aus Listen erst mal ne Liste machen, darauf kam ich nicht. Das wollte ich demnächst noch ändern. Aber danke für die Arbeit. Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 19. Feb. 2004 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für mkl-cad
Dieser Thread ist zwar schon zwei Wochen alt, aber ich kann's einfach nicht so stehen lassen. Es wurde zwar nicht an Steuerzeichen und Oktalwerte gedacht, aber der Ansatz mit prin1 ist schon richtig! Es geht aber doch alles viel einfacher: Ein kleine Test-Liste:
Code:
(setq testliste '(1 (2 . 3)"test" (4 "test\n mit\n cr") 5 "string mit \"quotes\" und \261 \274\ drin" ) )
Schreiben wir das mit princ in die Datei, geht's in die Hose: Code:
(princ testliste file) => 1(2 . 3)test(4 nochntest)5string mit "quotes" und ± ¼ drin
Mit prin1 sieht das schon viel freundlicher aus: Code:
(prin1 item fh) => 1(2 . 3)"test"(4 "test\n mit\n cr")5"string mit \"quotes\" und ± ¼ drin"
Da fehlen aber noch die Klammern drum - und dafür brauchen wir princ! Deshalb sieht die erste Grund-Routine so aus: Code:
(defun list>file1(lst filename / fh) (if(setq fh(open filename "w")) (progn (princ "(" fh) (foreach item lst (prin1 item fh) ) (princ ")" fh) (close fh) ) ) )(list>file1 testliste "c:/autolisp/testliste.lsp") => (1(2 . 3)"test"(4 "test\n mit\n cr")5"string mit \"quotes\" und ± ¼ drin")
Das kann man so weiterverwenden und wieder einlesen! Jetzt sollen aber mehrere Listen in eine Datei geschrieben werden - also muss das Symbol mitsamt der Bindung verarbeitet werden. Die Routine wird abgeändert: Code:
(defun list>file2(sym filename / fh) (if(setq fh(open filename "w")) (progn (princ "(setq " fh) (princ sym fh) (foreach item(cons'quote(list(eval sym)) (prin1 item fh) ) (princ "))" fh) (close fh) ) (princ"Datei konnte nicht geöffnet werden!\n") ) )
Beim Aufruf muss der Name der Liste gequotet werden: Code:
(list>file2 'testlist "c:/autolisp/fstest.lsp") => (setq TESTLIST(QUOTE (1 (2 . 3) "test" (4 "test\n mit\n cr") 5 "string mit \"quotes\" und ± ¼ drin")))
Um eine Funktion zum Wiedereinlesen brauchen wir uns keine Gedanken machen - da verwenden wir einfach LOAD!!! Code:
(load "c:/autolisp/fstest.lsp")
Und jetzt auch noch mehrere Listen auf einmal: Code:
(defun lists>file(symlist filename / fh) (if(setq fh(open filename "w")) (progn (foreach sym symlist (princ "(setq " fh) (princ sym fh) (foreach item(list(cons'quote(list(eval sym)))) (prin1 item fh) ) (princ ")" fh) ) (close fh) ) (princ"Datei konnte nicht geöffnet werden!\n") ) )
Mir persönlich gefällt dann diese Kombination am Besten: Code:
;;; Endgültige Fassung, alles andere waren nur Vorüberlegungen!(defun list>file(symlist filename / fh) (if(setq fh(open filename "w")) (progn (foreach sym(if(listp symlist)symlist(list symlist)) (princ "(setq " fh) (princ sym fh) (foreach item(list(cons'quote(list(eval sym)))) (prin1 item fh) ) (princ ")" fh) ) (close fh) ) (princ"Datei konnte nicht geöffnet werden!\n") ) ) ;;; Ende der endgültigen Fassung
Das kann man so aufrufen: Code:
(list>file 'liste1 "datei1.lsp")
oder auch so: Code:
(list>file '(liste1 liste2) "datei1.lsp")
Ein einziges LOAD genügt zum Wiederherstellen der Liste(n)! Gruß, Axel
------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkl-cad Mitglied Technischer Zeichner
Beiträge: 378 Registriert: 23.07.2003 ACAD 2002 Express Tools 1-9 Architektural Desktop Windows XP Server Windows 2003 3 GHz Rechner 1 GB RAM 80 GB Festplatte ATI FireGL V3100 2 17" Flachbildschirme
|
erstellt am: 11. Feb. 2005 08:27 <-- editieren / zitieren --> Unities abgeben:
Ganz große Klasse ! So finde ich es noch schöner. Die Datei ist dann übersichtlicher. Erst recht bei immer gleichen Listenaufbauten. (defun list>file(symlist filename / fh) (if(setq fh(open filename "w")) (progn (foreach sym(if(listp symlist)symlist(list symlist)) (princ "\n(setq " fh) (princ sym fh) (foreach item(list(cons'quote(list(eval sym)))) (prin1 item fh) ) (princ ")" fh) ) (close fh) ) (princ"Datei konnte nicht geöffnet werden!\n") ) ) ------------------ Martin Viele Grüße aus dem schönen Münsterland! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |