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
Bonjour à tous,

Je suis nouveau sur lisp and je suis confronté à plusieurs problèmes. J'essaie de lire un fichier textuel et de sauvegarder son contenu dans une liste grâce à un programme lisp mais cela ne marche pas.

Apparemment, la partie loop ne fonctionne pas.

Pouvez-vous m'aider ou me dire ce qui est faux dans ce script?


(defun parser ()
;Initialisation de la liste dico
(setq dico '())
;Initialisation d'une liste ligne
(setq ligne '(hello))
;Lecture du fichier dico
(with-open-file (stream "./dico.txt"))
(loop while (not (null ligne))
(setq ligne (read-line str))
(setq dico (cons ligne dico))
)
)


Fichier texte à parser:

MotCle01 MotResultat01
MotCle02 MotResultat02
MotCle03 MotResultat03
MotCle04 MotResultat04
A voir également:

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
(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.
1
yogis Messages postés 3 Date d'inscription lundi 7 mars 2016 Statut Membre Dernière intervention 11 mai 2016
8 mars 2016 à 10:42
Bonjour,

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.
0
Yoda > yogis Messages postés 3 Date d'inscription lundi 7 mars 2016 Statut Membre Dernière intervention 11 mai 2016
Modifié par Yoda le 8/03/2016 à 11:14
Non les fonctions car et cdr s'appliquent aux listes, dans tons cas ligne est un texte.

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.
0
yogis > Yoda
8 mars 2016 à 14:02
Re,
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?
0
Dans common Lisp, l'équivalent de substr est subseq, et l'équivalent de strlen est length.

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+
0
yogis > Yoda
11 mars 2016 à 13:40
Bonjour,
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
0