Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  \ durch \\ ersetzen

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:  \ durch \\ ersetzen (2227 mal gelesen)
tappenbeck
Mitglied
Vermessungsingenieur


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

Beiträge: 1213
Registriert: 30.05.2002

AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net

erstellt am: 22. Okt. 2004 12:56    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 !

ich möchte aus einer dos-pfadangabe eine LISP-konforme schreibweise machen und hierfür aus \ => \\ zu machen !

hierfür nutze ich eine replace-funktion (siehe unten), die eigentlich funktioniert. vielmehr habe ich das problem mit den \-zeichen.

wäre klasse, wenn mir jemand von euch weiterhelfen könnte.

Gruß Jan :-)

hier der code

(DEFUN rprof$replstr ;suchen und ersetzen eines Strings
  (line ;Zeichenkette
    oldstr ;alter String
    newstr ;neuer String
    /     iline  idx ;Replace Old String with New
    long    olong  nlong  str1    str2    tmp1
    tmp2
    )
  (SETQ iline line)
  (SETQ long  (STRLEN iline)
olong (STRLEN oldstr)
nlong (STRLEN newstr)
)
  (SETQ idx 1)
  (IF (> olong long)
    (SETQ long 0)
    ) ; gesuchter String länger als line

  (WHILE (<= idx long)
    (IF (= (SUBSTR iline idx olong) oldstr)
      (PROGN
(SETQ tmp1 (1- idx))
(SETQ tmp2 (+ idx olong))
(IF (<= tmp1 0)
  (SETQ str1 "") ; da 1. Zeichen
  (SETQ str1 (SUBSTR iline 1 tmp1)) ; String bis oldstr
  )
(SETQ str2 (SUBSTR iline tmp2)) ; String nach oldstr
(SETQ iline (STRCAT str1 newstr str2))
(SETQ long (STRLEN iline))
(SETQ idx (+ idx nlong))
)
      (SETQ idx (1+ idx))
      )
    )

  (SETQ iline iline)
  )

------------------
jan :-)

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 22. Okt. 2004 13: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 tappenbeck 10 Unities + Antwort hilfreich

Ich glaube, du hast da ein Ansatzproblem. Das hier:

(str-replace myString "\" "\\")

kann es nicht geben, weil es nur einen Fehler verursacht (nicht geschlossene Zeichenkette).

Gruß, Axel Strube-Zettler

------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

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

tappenbeck
Mitglied
Vermessungsingenieur


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

Beiträge: 1213
Registriert: 30.05.2002

AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net

erstellt am: 22. Okt. 2004 14:03    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

danke axel,

und ein schönes wochenende.

gruß Jan :-)

------------------
jan :-)

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 24. Okt. 2004 05:45    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 tappenbeck 10 Unities + Antwort hilfreich

Hallo Jan,

woher bekommst du denn diese Pfadangabe? Vielleicht ist dort eine Änderung notwendig/möglich.

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

tappenbeck
Mitglied
Vermessungsingenieur


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

Beiträge: 1213
Registriert: 30.05.2002

AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net

erstellt am: 25. Okt. 2004 09:16    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 holger,

die quelle ist zwangsläufig eine pfadangabe im DOS-Format (c:\test\...).

es bleibt also nur der weg ggf. die zeichenkette zu manipulieren.

gruß Jan :-)

------------------
jan :-)

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 25. Okt. 2004 09:36    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 tappenbeck 10 Unities + Antwort hilfreich

Hallo Jan,

ich weiß nicht, was jetzt eine Pfadangabe im DOS-Format von einer Pfadangabe im WIN-Format (bis auf die Zeichenenzahl) unterscheidet. Die Frage war auch, wie kommt diese Pfadangabe in das Programm - eintippen/getfiled/read-line???

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 25. Okt. 2004 11:46    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 tappenbeck 10 Unities + Antwort hilfreich

Ich sehe das Problem immer noch nicht. Der Backslash ist in Lisp-Zeichenketten das Steuerzeichen:

"c:\test"

ist der Text "C:est" mit einem Tab-Vorschub nach dem Doppelpunkt, und

"c:\\test" ist eine gültige Pfadangabe.

Der springende Punkt ist aber der, dass Lisp durchaus in der Lage ist, einen Backslash zu lesen:

*** Datei test.dat ***
c:\folder\myfile.txt
*** Ende Datei ***

(defun test( / fhand)
  (setq fhand(open(findfile"test.dat")"r"))
  (read-line fhand)
)

(test) => "c:\\folder\\myfile.txt"

Wie man sieht, entsteht da überhaupt kein Problem, genausowenig wie bei (getfiled) usw., und selbst mit Scripting Host und was-weiss-ich nicht.

Das einzige, was wirklich schiefgehen kann, ist das Eintippen auf der Kommandozeile oder im Code. Wenn man da ein "\t" eintippt, geht Lisp natürlich davon aus, dass man auch einen Tab meint. Ungültige Steuerzeichen werden einfach geschluckt:

(setq var "c:\anyfolder") => "c:anyfolder"

"\a" ist kein Steuerzeichen!

Also nochmal: Dein Programm ist einfach überflüssig. In allen Fällen des Einlesens sowieso, und im Fall des Eintippens nutzt es auch nix.

Gruß, Axel Strube-Zettler

------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

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

tappenbeck
Mitglied
Vermessungsingenieur


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

Beiträge: 1213
Registriert: 30.05.2002

AutoCAD (Map)2019, Topobase, MapEdit, Lisp, .vb.net

erstellt am: 29. Okt. 2004 14: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 axel,

meine frage ist glaube ich nicht ganz sinnlos - ich hole einwenig weiter aus !

ich habe eine parameterdatei mit folgendem aufbau:
(setq para1 9
      para2 "Otto"
      para3 "c:\\mein_programm\\test.txt"
....
)

diese datei wird beim programmstart gelesen mit LOAD.

wenn das programm nun zuende geht, dann werden die aktuellen parameter wieder in diese datei geschrieben u.a. mit

(write-line "para3" para3 fileno)

im ergebnis sieht das ganze dann aber wieder so aus:
...
para3 "c:\mein_programm\test.txt"
...

nach dem einlesen wird nämlich intern der o.g. string durch die sonderzeichenauswertung in "c:\mein_programm\test.txt" umgewandelt !

diesen string kann ich wieder in die para-datei schreiben und sieht dann so aus "c:\mein_programm\test.txt"

bis jetzt ist auch alles gut !

beim nächsten programmstart dann kommt wieder die sonderzeichenkonvertierung zu tragen und dann wird aus
"c:\mein_programm\test.txt" => "c:mein_programmtest.txt"

und spätestens jetzt geht alles nachfolgende den bach runter !!!

ich hoffe du verstehst jetzt meine ansatz warum ich aus "\" => "\\" mit einer art suche und ersetzen machen will !

oder hast du für diesen fall eine bessere idee ???

ansonsten ein schönes wochenende.

gruß Jan :-)

------------------
jan :-)

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 29. Okt. 2004 17:55    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 tappenbeck 10 Unities + Antwort hilfreich

Jepp, jetzt dämmert's mir. Dieses kleine Testprogramm zeigt dir, dass in deinem Falle (prin1 ...) statt (write-line) angesagt ist:
Code:

(defun test( / fhand)
  (if(setq fhand(open "c:\\delete.me" "w"))
    (progn
      (mapcar
       '(lambda(func / )
          ((eval(read func))(strcat func"= c:\\folder\\file\n")fhand)
        )
       '("write-line""print""princ""prin1")
      )
      (close fhand)
    )
  )
)

Alternativ kannst du aber auch ersetzen, aber eben nicht "\" durch "\\", sondern "\\" durch "\\\\"! Dazu kannst du einfach meine string-Funktionen nehmen, wie sie auch auf meinen advanced-Seiten zu finden sind:

(str-subst "c:\\folder\\file" "\\\\" "\\")
 
Hier findest du str-subst und zig weitere String-Funktionen:
http://www.autolisp.mapcar.net/strings.html
http://www.autolisp.mapcar.net/strings2.html
http://www.autolisp.mapcar.net/strtok.html

Gruß, Axel Strube-Zettler

------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

[Diese Nachricht wurde von mapcar am 29. Okt. 2004 editiert.]

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