Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lisp Discussion :

Lecture d'un fichier textuel en lisp


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Lecture d'un fichier textuel en lisp
    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?

    Merci d'avance pour votre aide.
    Code lisp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    (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))
     )
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MotCle01 MotResultat01
    MotCle02 MotResultat02
    MotCle03 MotResultat03
    MotCle04 MotResultat04

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    avril 2008
    Messages
    1 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : avril 2008
    Messages : 1 867
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par phdenis Voir le message
    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.
    Que se passe-t-il pour que tu dises "cela ne marche pas"?

    Y a-t-il un message d'erreur?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Lecture d'un fichier textuel en lisp
    Bonsoir,
    Il me disait que j'avais une erreur de syntaxe mais il s'agit de la ligne juste après loop, il manque le 'do'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    (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))
     )
    )
    ++++++++++++++++
    Ce que je ne comprends pas c'est que malgré le fait que j'ai ajouté la ligne format dans ma fonction parser, rien ne s'affiche.
    Pour la 2e fonction, ce que je comprends c'est que je n'ai pas fait le nécessaire pour faire passer un paramètre à la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    (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 (nil 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)))
    )
     
    (defun display(MyListe)
        (cond
         ((eq MyListe nil) nil)
         ;Parcours de la base
         (listp (car MyListe) (cdr MyListe))
         ;Affiche le car et le cdr de MyListe
         (print (car MyListe) (cdr MyListe)))
    )

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    avril 2008
    Messages
    1 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : avril 2008
    Messages : 1 867
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par phdenis Voir le message
    Bonsoir,
    Il me disait que j'avais une erreur de syntaxe mais il s'agit de la ligne juste après loop, il manque le 'do'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    (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))
     )
    )
    Pour faire gagner du temps à tout le monde (toi et les lecteurs du forum), il vaudrait mieux que tu testes ton code et que tu écrives APRÈS avoir corrigé ce genre d'erreur!

    Ce que je ne comprends pas c'est que malgré le fait que j'ai ajouté la ligne format dans ma fonction parser, rien ne s'affiche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    (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 (nil 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)))
    )
     
    (defun display(MyListe)
        (cond
         ((eq MyListe nil) nil)
         ;Parcours de la base
         (listp (car MyListe) (cdr MyListe))
         ;Affiche le car et le cdr de MyListe
         (print (car MyListe) (cdr MyListe)))
    )
    Actuellement, je n'ai pas d'interprète lisp sur ma machine... donc j'interprète avec les yeux!

    Il vaudrait mieux que les variables "dico" et "ligne" soient locales et non globales (cf. "let").

    Il vaudrait mieux que "parser" retourne la liste lue pour l'affecter dans l'appelant.

    Dans ton code, la variable "ligne" est affectée à une valeur bidon avant la boucle, ce qui n'est pas bon.
    De plus, elle est testée avant d'être modifiée, ce qui n'est pas bon.
    Il vaudrait mieux tester la valeur affectée, ce que l'on peut faire avec quelque chose comme (loop while (not (nil (setq ligne ..., par exemple.

    Les fonctions en lisp s'écrivent (la_fonction arg1 arg2 etc.) et non (comme dans d'autres langages) la_fonction (arg1 arg2 etc.)... cf. car(ligne) entre autres.

    Quand tu as un doute sur l'utilisation d'une fonction, le plus simple, c'est d'aller voir le CLHS.

    Par exemple, pour lire le fichier, tu peux te référer à l'exemple donné pour la fonction "with-open-file" (cf. ce lien: CLHS - with-open-file) et utiliser "do" plutôt que "loop".

    Si tu passais dans la boucle, il devrait au moins y avoir un message d'erreur sur car(ligne).

    Si rien ne s'affiche, malgré l'erreur sur car(ligne), c'est probablement que tu ne passes pas dans la boucle!

    Pour la 2e fonction, ce que je comprends c'est que je n'ai pas fait le nécessaire pour faire passer un paramètre à la fonction.
    Je ne comprends pas la question.

    Il y a aussi une erreur dans "display".
    Que donne le test unitaire: (display '("un" "deux" "trois")) ?

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    mai 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : mai 2013
    Messages : 144
    Points : 261
    Points
    261
    Par défaut
    On peut former la liste des lignes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (with-open-file (in my-file :direction :input)
      (loop for line = (read-line in nil)
            while line
            collect line))

Discussions similaires

  1. Lecture d'un fichier .dbf
    Par San Soussy dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 07/07/2004, 17h30
  2. Réponses: 6
    Dernier message: 02/09/2003, 16h12
  3. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 21h40
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 09h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo