IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Ruby Discussion :

Tableau deux dimensions et fichier


Sujet :

Ruby

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    .
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Tableau deux dimensions et fichier
    Bonjour,

    Je débute sur Ruby, j'essaye de sauvegarder une liste de noms et de prénoms dans un fichier, puis retrouver cette même liste pour la charger au début d'un script.

    Y aurait-il un moyen d'optimiser ce code ? Après avoir essayer différentes solutions, je n'ai trouvé que celle-ci qui marche, j'ai du me résoudre à utiliser une boucle while. Tous vos conseils seraient les bienvenus.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    # Une collection de noms et prenoms
    liste = 
    [
    	["Fabien", "Drouet"],
    	["Hugo", "Bru"],
    	["Lucas", "Mauger"],
    	["Alice", "Bouchet"],
    	["Zoe", "Rouault"],
    	["Jeremy", "Houssan"],
    	["Adrien", "Dotte"],
    	["Dorian", "Favre"],
    	["Aurore", "Boue"],
    	["Amandine", "Fournier"],
    	["Lena", "Dubois"]
    ] 
     
    # Ecriture du tableau dans un fichier
    open( 'liste.txt', 'w' ) do |fichier|
    	liste.each { |line| fichier.puts line }
    end
     
    classe_recup = []
     
    # Recuperation de la liste a partir du fichier dans une variable 'tampon'
    # Probleme: le tableau a deux dimensions n'est pas recupere
    open('liste.txt').each do |line|
    	classe_recup << line.chomp
    end
     
    # Recuperation du tableau original via le traitement de la variable tampon,   
    # vers -> new_tab
    new_tab, i = [], 0
    while (i <= (classe_recup.length-1))
    	new_tab << [classe_recup[i],classe_recup[i+1]]
    	i += 2
    end
     
    p new_tab

  2. #2
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut
    Bonjour,
    je te propose avant tout d'utiliser un format un peu "structuré" au cas où ta liste évolue dans le futur : JSON, YAML, CSV. Cela te permettra aussi d'utiliser des bilbiothèques qui font très bien la sérialisation.

    Ta solution se rapproche le plus de CSV. Je mettrais deux éléments par ligne puisque c'est ainsi que fait ton tableau.

    Si je ne voulais pas utiliser CSV, mon code serait simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # enregistrer
    File.open("noms.csv", "r") {|f| tableau.each {|n| f.puts n.join(';')} }
     
    # charger
    tableau = IO.readlines("noms.csv").map{|n| n.split(';') }
    Et... c'est tout.


    Citation Envoyé par critas Voir le message
    Y aurait-il un moyen d'optimiser ce code ? Après avoir essayer différentes solutions, je n'ai trouvé que celle-ci qui marche, j'ai du me résoudre à utiliser une boucle while. Tous vos conseils seraient les bienvenus.
    Quand tu dis optimiser, j'ai lu "améliorer la lisibilité et concision".
    Si ça se trouve tu as des millions de noms et tu sens un ralentissement niveau performance. Si c'est ça ton problème, ma réponse n'est pas bonne. Mais j'en doute.

    D'une manière générale, le Rubyiste n'aime pas la boucle while.
    Toutes les collections savent faire "each" et "map" qui prennent l'ensemble de ton tableau du premier au dernier (pas de souci d'index comme en C) et le donnent à un bloc (tu peux voir un bloc comme une mini fonction anonyme).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    open( 'liste.txt', 'w' ) do |fichier|
    	liste.each { |line| fichier.puts line }
    end
    Ce qui m'étonne c'est que ça devrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jeandupont
    pauldubois
    dans le fichier, et pourtant je crois que ton code de lecture s'attend à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jean
    dupont
    paul
    dubois
    Non ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Recuperation de la liste a partir du fichier dans une variable 'tampon'
    # Probleme: le tableau a deux dimensions n'est pas recupere
    open('liste.txt').each do |line|
    	classe_recup << line.chomp
    end
     
    # Recuperation du tableau original via le traitement de la variable tampon,   
    # vers -> new_tab
    new_tab, i = [], 0
    while (i <= (classe_recup.length-1))
    	new_tab << [classe_recup[i],classe_recup[i+1]]
    	i += 2
    end
    Tu pouvais tout mettre dans la fonction d'au-dessus, en plus tu avais déjà fait un each et tout ^^

    Bref, bon courage, bon apprentissage et rappelle-toi :
    - il y a sûrement quelqu'un qui a eu ton problème
    - cette personne y a sûrement passé du temps et du jus de cerveau
    - il y a sûrement une bibliothèque ou un gem
    - si tu fais plus de 5 à 10 lignes de code dans une fonction,
    tu t'es sûrement trompé quelque part.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    .
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, j'ai cherché une solution plusieurs fois avec each, j'avais aussi en tête split et join mais je n'arrivais pas à tout assembler je ne suis pas encore très familier avec cette syntaxe. J'ai une petite expérience du C, mais passer à Ruby change beaucoup de choses. Par optimiser, je voulais dire le rendre compréhensible en Ruby et souligner les erreurs, c'était un peu trop bricoler pour être bon.

    Pour le code d'écriture, si je comprend bien puts applique "\n" à chaque élément dans l'objet en paramètre, du coup les noms et prénoms sont sur deux lignes différentes à la fin du traitement de la ligne, et oui le code de lecture reprend ligne après ligne.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/04/2011, 04h46
  2. Réponses: 11
    Dernier message: 17/02/2011, 01h01
  3. Tableau à deux dimensions et données dans un fichier texte
    Par Roud9 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/02/2011, 19h53
  4. Réponses: 6
    Dernier message: 05/02/2009, 09h34
  5. Mettre un fichier csv dans un tableau à deux dimensions
    Par neeux dans le forum Général Python
    Réponses: 5
    Dernier message: 05/03/2007, 16h36

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