Lecture d'un fichier texte, sauvegarde dans une liste
Résolu/Fermé
yogis
Messages postés
3
Date d'inscription
lundi 7 mars 2016
Statut
Membre
Dernière intervention
11 mai 2016
-
7 mars 2016 à 16:09
Yoda - 13 mars 2016 à 22:00
Yoda - 13 mars 2016 à 22:00
A voir également:
- Lecture d'un fichier texte, sauvegarde dans une liste
- Liste déroulante excel - Guide
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Logiciel de sauvegarde - Guide
1 réponse
Bonjour,
La ligne suivante
(setq dico (cons ligne dico))
te retourne une liste à un élément qui à pour valeur ligne
regardes ce test
Si tu veux parser la ligne, dans ton cas c'est assez simple car il n'y a que 2 mots, il faut d'abord repérer la position du séparateur (l'espace) et ensuite extraire le terme de gauche et le terme de droite en utilisant les fonctions strlen et substr.
La ligne suivante
(setq dico (cons ligne dico))
te retourne une liste à un élément qui à pour valeur ligne
regardes ce test
(defun test()
(setq dico '())
(setq ligne "MotCle01 MotResultat01")
(setq dico (cons ligne dico))
)
Si tu veux parser la ligne, dans ton cas c'est assez simple car il n'y a que 2 mots, il faut d'abord repérer la position du séparateur (l'espace) et ensuite extraire le terme de gauche et le terme de droite en utilisant les fonctions strlen et substr.
8 mars 2016 à 10:42
Merci pour ta réponse, mais je ne comprends pas l'appel aux fonction strlen ou substr sachant que c'est en lisp à moins que ces fonctions existent aussi en lisp :$
Je pensais tout simplement faire un car(ligne) et un cdr(ligne) pour récupérer la 1e et 2e partie.
Modifié par Yoda le 8/03/2016 à 11:14
Pour preuve testes (car "MotCle01 MotResultat01"), ça provoque une erreur
(car '("MotCle01 MotResultat01")), ça retourne "MotCle01 MotResultat01"
(car '("MotCle01" "MotResultat01")), retourne "MotCle01"
Tu vois la différence? Donc il faut isoler chaque mot et constituer une liste de 2 textes.
En ce qui concerne les fonctions strlen et substr, moi j'utilise Autolisp qui reconnait ces fonctions. Je pense que CommonLisp a aussi ces fonctions, peut-être avec une autre syntaxe. Cest quoi ton Lisp?
Sinon la logique est la même quel que soit le Lisp.
8 mars 2016 à 14:02
Mon lisp est common lisp.
Pas compris pour la différence entre texte et liste vs. mon exemple. (désolé, cela peut paraitre stupide)
Pour en revenir au test, j'ai écrit la fonction test dans mon prompt et essayer d'afficher la variable dico mais il m'écrit qu'il ne la connait.
J'ai encore raté un truc?
Modifié par Yoda le 8/03/2016 à 14:44
Je n'ai pas l'interpreteur common Lisp, alors je ne sais pas précisément comment charger et executer une fonction personnelle comme test.
Je pense qu'il suffit de taper (test) sur le prompt.
Sur ton prompt tu peux aussi executer ligne par ligne
(car "MotCle01 MotResultat01")
(car '("MotCle01 MotResultat01"))
(car '("MotCle01" "MotResultat01"))
compares les résultats
Un texte est un seul objet : "MotCle01 MotResultat01"
Une liste est une suite d'objets
'("MotCle01 MotResultat01") 1 element
'("MotCle01" "MotResultat01") 2 éléments
A+
11 mars 2016 à 13:40
Merci, je pense avoir compris la différence entre le texte et une liste. Par contre, je ne m'explique pas pourquoi il me m'affiche pas la ligne lue dans l'exemple ci-dessous.
(defun Parser ()
; Affiche Message utilisateur
(format t "Fonction Parser")
; Initialisation de la liste dic
(setq dico '())
; Initialisation d'une liste ligne
(setq ligne '())
; Lecture du fichier dico
(with-open-file (stream "./dico.txt")
(loop while (not (null ligne))
do (setq ligne (read-line stream))
(format t "Field 01: ~S~% and associated Field 02: ~S~%" car(ligne) cdr(ligne))
(setq dico (cons ligne dico))))
)
Sachat que le contenu de dico.txt est
MotCle01 MotRes01
MotCle02 MotRes02
MotCle03 MotRes03
Au pire, je m'attendrais à ce qu'il affiche ligne par ligne
MotCle01 MotRes01