Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Comme à mon habitude une idée farfelue me trotte dans la tête et je n'arrive pas à la faire fonctionner, surement que nos linguistes incontestables du lisp vont même trouver ça simpliste, mais je bloque et je n'ose même pas poster les petits bouts de code qui sont trop pitoyables et qui ne marchent jamais, bref je cherche tout simplement à modifier des caractères dans un fichier txt à partir d'un lisp, de façon à ne pas retourner dans le bloc note et utilisé "remplacer" à chaque nouveau fichier.

 

Une direction me porte vers les Fonctions Read-char, Write-char ou même Read-line, et la je bloque, à la fin faut-il ecrire un nouveaux fichier txt ou ces commandes remplacent directement les caractères dans le fichier choisis préalablement ?

 

Je cherche par exemple à faire :

 

Ouvrir et choisir mon fichier txt

(setq filename (getfiled "Sélectionner un fichier texte" "" "txt;*" 0 ))

 

Rechercher dans toutes les lignes "A=" et les remplacer par "T:"

 

Merci d'avance pour vos idées et aide à la conduite sur ce code pour que je ne m'enlise pas...

Posté(e)

Salut,

 

Rapidement pour le principe, écrit à la volé..

A tester

 

(defun c:testxt (/ fich desc string-subst-all lst)
 (defun string-subst-all (n o l / p)
   (if (setq p (vl-string-search o l))
     (string-subst-all n o (vl-string-subst n o l p))
     l
   )
 )
 (and (setq desc (open (setq fich (getfiled "Sélectionner un fichier texte" "" "txt;*" 0)) "r"))
      (while (setq line (read-line desc)) (setq lst (cons (string-subst-all "T:" "A=" line) lst)))
      (not (close desc))
      (setq lst (reverse lst))
      (setq desc (open fich "w"))
      (foreach line lst (write-line line desc))
      (close desc)
 )
 (princ)
)

 

A+

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Merci beaucoup pour cette réponse qui correspond exactement à mon besoin, j'avoue que j'en attendais pas autant et que j'en étais bien loin.

 

De plus, bien que j'ai trituré ces lignes de code dans tout les sens, je n'ai pas réussi à incrémenter 2 modifications sans recharger le fichier txt, que dois-je faire ?

 

J'ai testé la copie du "while", j'ai ajouté des "and", des "or", rajouté une variable "lst2" et j'en passe...

 

Bref comme à ma triste habitude rien ne fonctionne quand je modifie.

 

Un indice ne serait pas de refus si cette option reste simple à rajouté.

 

(A= .... T: et B= ....G: )

 

Merci beaucoup pour cette nouvelle étape dans ma compréhension du lisp.

Posté(e)

Bonjour,

 

De plus, bien que j'ai trituré ces lignes de code dans tout les sens, je n'ai pas réussi à incrémenter 2 modifications sans recharger le fichier txt, que dois-je faire ?

[...]

Un indice ne serait pas de refus si cette option reste simple à rajouté.

 

(A= .... T: et B= ....G: )

 

Remplace:

(string-subst-all "T:" "A=" line)

par

(foreach x '(("A=" . "T:") ("B=" . "G:")) (setq line (string-subst-all (cdr x) (car x) line)))

 

Pour l'exemple le code modifié et commenté:

(defun c:testxt (/ fich desc string-subst-all lst line)
   
   ;; Pour le cas ou il y aurait plusieurs occurences à substituer dans une même ligne
   ;; Si une seul occurence par ligne remplacer string-subst-all par vl-string-subst
   ;; dans le code
   (defun string-subst-all (n o l / p)
     (if (setq p (vl-string-search o l))
       (string-subst-all n o (vl-string-subst n o l p))
       l
     )
   )
   
   ;; Programme principal
   (if ;; Sélection du fichier
       (setq fich (getfiled "Sélectionner un fichier texte" "" "txt;*" 0))
     
     (progn ;; Ouverture du fichier en lecture 
            (setq desc (open fich "r"))
            ;; Boucle de lecture de l'ensemble des lignes
            (while (setq line (read-line desc))
              ;; Substitution des chaînes de caractères dans la ligne  
              (foreach x '(("A=" . "T:") ("B=" . "G:")) (setq line (string-subst-all (cdr x) (car x) line)))
              ;; Stockage de la ligne modifié dans une liste (stockage inversé)
              (setq lst (cons line lst))
            )
            ;; Fermeture du fichier
            (close desc)
       
            ;; Ouverture du fichier en écriture
            (setq desc (open fich "w"))
            ;; Ecriture des lignes dans le fichier
            (foreach line (reverse lst) (write-line line desc))
            ;; Fermeture du fichier
            (close desc)
     )
   )
   
   (princ)
 )

 

A+

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Bonjour et un Grand Merci à "VDH-Bruno" pour ta réponse plus que complète et toutes tes explications et commentaires pour et dans ce code qui me seront utiles et qui me permettent de comprendre davantage ce langage que j'apprécie énormément, j'étudie avec une grande attention toutes ces fonctions de façon à pouvoir à l'avenir faire fonctionner mes idées de ce style.

 

Encore un Grand merci pour ce temps passé à me répondre et qui fait preuve d'une belle générosité de savoir faire et d'enseignement, j'espère également que ce sujet ce sera utile à d'autre.

 

Et si je peu encore me permettre, peut-on créer un nouveau fichier du résultat, avec par exemple une extension nouvelle du genre ".top" au lieu de modifié le fichier original de façon à le préserver ?

 

Au plaisir de vous lire...

Posté(e)

C'est Ok, même si c'est pas "propre" j'ai réussi à créer un autre fichier en préservant mon fichier original:

 

;;Ouverture du fichier en écriture
                      
(setq fich2 (getfiled "Créer un fichier" fich "top" 1))
   
(setq desc2 (open fich2 "w"))

;; Ecriture des lignes dans le fichier
            
(foreach line (reverse lst) (write-line line desc2))

(alert (strcat "Séparateur transformés avec Succès dans le Fichier Choisi : " (strcase fich2)))          

;; Fermeture du fichier
            
(close desc2)

 

Bien sûr grâce aux commentaires dans le code

Posté(e)

Re,

Encore un Grand merci pour ce temps passé à me répondre et qui fait preuve d'une belle générosité de savoir faire et d'enseignement,

J'ai personnellement beaucoup pris sur ce forum, je m'efforce de rendre quant je peux...

 

Et si je peu encore me permettre, peut-on créer un nouveau fichier du résultat, avec par exemple une extension nouvelle du genre ".top" au lieu de modifié le fichier original de façon à le préserver ?

Oui, un exemple:

_$ (setq fich "C:\\Users\\toto\\Documents\\000000000\\TEST\\toto.txt")
"C:\\Users\\toto\\Documents\\000000000\\TEST\\toto.txt"
_$ (strcat (substr fich 1 (- (strlen fich) 3)) "top")
"C:\\Users\\toto\\Documents\\000000000\\TEST\\toto.top"

 

A+

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Super, encore mieux car mon bricolage conservait le nom de fichier avec l'extension dans la variable "Fich" et la c'est parfait.

 

(setq fich2 (strcat (substr fich 1 (- (strlen fich) 3)) "top"))

 

Si je comprend bien la fonction "- strlen" retire les 3 derniers caractères de la variable.

 

Merci

Posté(e) (modifié)

(setq fich2 (strcat (substr fich 1 (- (strlen fich) 3)) "top"))

Si je comprend bien la fonction "- strlen" retire les 3 derniers caractères de la variable.

La fonction strlen (string length) mesure la longueur de la chaîne de caractère, puis avec l'opérateur moins je soustrait 3 à cette longueur.

C'est avec la fonction substr que l'on retire les 3 derniers caractères (plus exactement que l'on garde tous ceux précède -> Du 1er caractère au Nième caractères - 3 caractères).

 

A+

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité