Aller au contenu

Alimenter une liste depuis en TXT


Messages recommandés

Posté(e)

Bonjour à tous,

 

Je cherche à alimenter une liste issue du contenu d'un .txt

 

J'ai fini par choisir cette structure pour le fichier "Vendeur.txt" sans être convaincu que ce soit la meilleure :

"Alexamdre M." "Christian B." "François B." "Issam B.A." "Jérémy R." "Johan B." "Kévin R." "Marc D."

 

Et voici mon code :

(defun c:TestTXT (/ Liste Fich)
 (setq Fich (open "Vendeur.txt" "r")) ;ouverture du TXT
 (setq Liste (read-line Fich)) ;remplit le liste avec lecture de la ligne du TXT
 (close Fich) ;fermeture du fichier TXT
 (princ Liste) ;affiche la liste
) ;_ Fin de defun

 

Mon problème ? Le résultat :

"\"Alexamdre M.\" \"Christian B.\" \"François B.\" \"Issam 
B.A.\" \"Jérémy R.\" \"Johan B.\" \"Kévin R.\" \"Marc D.\""

 

Mon code lit la totalité de la ligne (normal) et je me retrouve avec un seul élément dans ma liste... Ce qui est logique...

 

Je pense donc à placer un seul nom par ligne dans le TXT et faire un "while not eof" pour remplire ma liste... Mais avant de me lancer, j'aimerai avoir vos avis sur ma "méthode"... Si c'est la bonne, s'il y a plus simple, plus court, plus sûr...

 

Merci pour votre aide éventuelle,

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour,

 

Tu peux utiliser la fonction STRTOK présente sur cette page http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=13174#pid130401

pour transformer ta chaine de caractère en liste

 

;;; STRTOK (Vladimir Nesterovsky) Retourne une liste de chaines
;;; ex : (strtok "abc,def" ",") -> ("abc" "def")


(defun strtok (strng chs / len c l s cnt chsl)
 (setq chsl (strtol chs))
 (setq	len (strlen strng)
s   ""
cnt (1+ len)
 )
 (while (> (setq cnt (1- cnt)) 0)
   (setq c (substr strng cnt 1))
   (if	(member c chsl)
     (if (strp s)
(setq l	(cons s l)
      s	""
)
     )
     (setq s (strcat c s))
   )
 )
 (if (strp s)
   (cons s l)
   l
 )
) 

 

Etienne

www.le-metal.net, sur la métallerie
Posté(e)

Tu réponds toi-même à ta question :

Mets donc un champs par ligne et boucle avec WHILE genre (while (setq Liste (read-line Fich))

suivi d'un APPEND

 

En Français, tu dois programmer : "tant que read-line, augmente la liste" quand read-line finira par renvoyer nil (quand il n'aura plus de ligne à lire dans le fichier), tu sortiras de la boucle while. Il n'y aura plus qu'à fermer le fichier.

 

Ca va aller tout seul ou tu veux l'exemple ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut,

 

Merci à vous deux... Je vais tenter de faire une boucle "while"... Je vais chercher la bonne syntaxe... Ca ne doit pas être sorcier ;)

 

Merci encore

 

Denis...

 

 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

Je ne comprends plus rien, ma routine qui fonctionnait me sort maintenant :

; erreur: type d'argument incorrect: FILE nil

Alors que je n'ai pas changé une seule virgule et mon TXT est toujours à la même place ! !

 

J'ai essayé çà :

Mon txt en une ligne :

Alexamdre M.,Christian B.,François B.,Issam B.A.,Jérémy R.,Johan B.,Kévin R.,Marc D.

et mon lsp :

(defun c:TestTXT (/ Liste Fich)
 (setq Fich (open "Vendeur.txt" "r"))
 (setq Liste (read-line Fich))
 (strtok Liste ",")
 (close Fich)
 (princ Liste)

) ;_ Fin de defun



;;; STRTOK (Vladimir Nesterovsky) Retourne une liste de chaines
;;; ex : (strtok "abc,def" ",") -> ("abc" "def")
;Merci à (gile)
(defun strtok (strng chs / len c l s cnt chsl)
 (setq chsl (strtol chs))
 (setq len (strlen strng)
       s   ""
       cnt (1+ len)
 ) ;_ Fin de setq
 (while (> (setq cnt (1- cnt)) 0)
   (setq c (substr strng cnt 1))
   (if (member c chsl)
     (if (strp s)
       (setq l (cons s l)
             s ""
       ) ;_ Fin de setq
     ) ;_ Fin de if
     (setq s (strcat c s))
   ) ;_ Fin de if
 ) ;_ Fin de while
 (if (strp s)
   (cons s l)
   l
 ) ;_ Fin de if
) ;_ Fin de defun

Je vais me tourner vers VBA, dommage, j'aime bien le Lisp...

 

Bonne nuit à tous,

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut

 

Je vais te faciliter la tâche (non testé)

(defun c:TestTXT (/ Liste Fich texte)
 (setq Fich (open "Vendeur.txt" "r"))
 (while (setq texte (read-line Fich))
   (setq Liste (cons texte Liste))
 )
 (close Fich)
 (princ (reverse Liste))
) ;_ Fin de defun

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é