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

Java Discussion :

Découpage d'un fichier texte en plusieurs parties


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Informatique de Gestion
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informatique de Gestion

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut Découpage d'un fichier texte en plusieurs parties
    Bonjour à tous,

    Je suis étudiant en informatique de gestion et j'ai un petit problème qui me taraude...
    J'ai un fichier texte comme celui-ci mais comportant plus de données :

    IGS;1;3
    IGS;2;2
    IGS;3;1
    IGS;4;1
    /
    IGS;2;Baker Valentin
    IGS;3;Bise Andre
    IGS;2;Blackshaw Deborah
    IGS;1;Blanco Raphael
    IGS;1;Broccard Marion
    
    L'exercice que je dois réaliser est le suivant :
    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
    /* ÉNONCÉ:
       Le programme que vous devez réaliser doit effectuer la répartition des étudiants 
       dans les différentes classes pour la prochaine rentrée de la HEG.
       Toutes les données sont reprises du fichier "DonneesRentree.txt" puis stockées
       dans l'ArrayList classes */
     
    public class Rentree {
     
    	private static ArrayList classes = new ArrayList(); /* Données */
     
      /* Le String reçu contient tout le fichier "DonneesRentree.txt", qui est décomposé en 2 parties : 
         1) la 1ère partie spécifie le nombre de classes à créer pour chaque filière/degré :
            - IGS;1;3 ==> indique que vous devez créer 3 classes d'IGS 1ère année (IGS1-1, IGS1-2 et IGS1-3)
            - IGS;2;2 ==> indique que vous devez créer 2 classes d'IGS 2ème année (IGS2-1 et IGS2-2)
         2) la 2ème partie spécifie la liste des étudiants à insérer dans les différentes classes selon
            leur filière & degré :
            - IGS;2;Baker Valentin ==> indique qu'il faut ajouter "Baker Valentin" dans une classe d'IGS 2ème année.
            Pour décider dans quelle classe l'ajouter (IGS2-1 ou IGS2-2), on regarde dans laquelle il y a le MOINS d'étudiants.
         Les 2 parties du fichier sont séparées par le délimiteur "/" en début de ligne */
    	private static void creerClasses (String str) {
     
     
     
     
     
     
        // ====================
        // ====== A CODER =====
        // ====================
     
      } // creerClasses
    Voilà je suis un peu perdu du fait du délimiteur "/" dans le fichier texte...
    Merci de prendre le temps de me lire ainsi que pour votre aide.

    Adrien

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Et quel est ton problème précisément ?
    Quel est ton code ?

    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Informatique de Gestion
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informatique de Gestion

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut
    Alors voici le type de données à obtenir (Exemples d'exécution avec le fichier de données fourni) :

    - Avec le paramètre IGS

    ---------- Exécution avec arguments ----------
    
    IGS1-1      5 étudiants: (Blanco Raphael, … , … , …)
    IGS1-2      4 étudiants: (Broccard Marion, … , … , …)
    …
    Soit 28 étudiants en tout.
    
    
    - Avec le paramètre : IGS 4

    ---------- Exécution avec arguments ----------
    
    IGS4-1 Aucun étudiant !
    Soit 0 étudiants en tout.
    
    Voici l'exercice en entier avec ce que j'ai fait :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    import java.util.*;
    /* ÉNONCÉ:
       Le programme que vous devez réaliser doit effectuer la répartition des étudiants 
       dans les différentes classes pour la prochaine rentrée de la HEG, 
       puis afficher les classes d'une certaine filière et degré.
       Toutes les données sont reprises du fichier "DonneesRentree.txt" puis stockées
       dans l'ArrayList classes */
     
    public class Rentree {
     
    	private static ArrayList classes = new ArrayList(); /* Données */
    	private static final String SepBloc = "/"; 
    	private static final String SepLigne = "\n\r";
    	private static final String SepChamps = ";"; 
     
      /* Le String reçu contient tout le fichier "DonneesRentree.txt", qui est décomposé en 2 parties : 
         1) la 1ère partie spécifie le nombre de classes à créer pour chaque filière/degré :
            - IGS;1;3 ==> indique que vous devez créer 3 classes d'IGS 1ère année (IGS1-1, IGS1-2 et IGS1-3)
            - IGS;2;2 ==> indique que vous devez créer 2 classes d'IGS 2ème année (IGS2-1 et IGS2-2)
         2) la 2ème partie spécifie la liste des étudiants à insérer dans les différentes classes selon
            leur filière & degré :
            - IGS;2;Baker Valentin ==> indique qu'il faut ajouter "Baker Valentin" dans une classe d'IGS 2ème   
           année.
            Pour décider dans quelle classe l'ajouter (IGS2-1 ou IGS2-2), on regarde dans laquelle il y a le  
            MOINS d'étudiants.
         Les 2 parties du fichier sont séparées par le délimiteur "/" en début de ligne */
     
    private static void creerClasses (String str) {
      StringTokenizer stBloc = new StringTokenizer (str, SepBloc);
         while (stBloc.hasMoreTokens()) {
         StringTokenizer stClasse = new StringTokenizer ( stBloc.nextToken() , SepLigne);
           while (stClasse.hasMoreTokens()) {
           StringTokenizer stClasseChamps = new StringTokenizer ( stClasse.nextToken(), SepChamps);
             while (stClasseChamps.hasMoreTokens()) {
             String filiere = stClasseChamps.nextToken();
             int degre = Integer.parseInt(stClasseChamps.nextToken());
             int numClasse =  Integer.parseInt(stClasseChamps.nextToken());
             for (int i=1; i < numClasse + 1 ; i++ ) { 
     
    	Classe classe = new Classe(filiere, degre, i, ...);
     
            }
        }
     }
    StringTokenizer stEtudiants = new StringTokenizer (stBloc.nextToken(), SepLigne);
      while (stEtudiants.hasMoreTokens()) {
      StringTokenizer stEtudiantsChamps = new StringTokenizer ( stEtudiants.nextToken(), SepChamps);
        while (stEtudiantsChamps.hasMoreTokens()) {
        String filiere = stEtudiantsChamps.nextToken();
        int degre = Integer.parseInt(stEtudiantsChamps.nextToken());
        String nomPrenom = stEtudiantsChamps.nextToken();
     
       Etudiant etudiant = new Etudiant(filiere, degre, nomPrenom);
       }
     }
    }
      } // creerClasses
     
      /* Affiche les classes d'une certaine filière (1er paramètre reçu),
         et éventuellement d'un certain degré (s'il y a un 2ème paramètre, c'est le degré).
         Exemples : 
         - si on lance main() avec uniquement "IGS", affichera toutes les classes IGS: IGS1-1, IGS1-2, IGS1-3, IGS2-1, IGS2-2, IGS3-1, IGS4-1.
         - si on lance main() avec "IGS 1", n'affichera que les classes de 1ère année d'IGS: IGS1-1, IGS1-2, IGS1-3.
         À la fin de l'affichage, il faudra également indiquer le nombre total d'étudiants affichés.
         L'affichage doit être conforme à celui qui est reproduit dans l'énoncé. */
      public static void afficherClasses (String[] args) {
     
      } // afficherClasses
     
    public static void main (String[] args) {
      if (args.length != 1 && args.length != 2) {
         System.out.println("Vous devez indiquer la filière, et éventuellement le degré !");
      } else {
        creerClasses(FileToStr.read("DonneesRentree.txt"));
        afficherClasses(args);
      }
    } // main
     
    } // Rentree
    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
     
    /**
    * Une instance de cette classe représente un étudiant.
    */
    public class Etudiant {
     
      private String nomPrenom;
     
     
      public Etudiant(String nomPrenom) {
    	  this.nomPrenom = nomPrenom;
      }
     
      public String toString() {
    	  return nomPrenom;
      }
     
    } // Etudiant
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    import java.util.*;
    /**
    * Chaque instance représente une classe, avec la liste des étudiants de cette classe.
     
     */
    public class Classe {
     
      private String filiere;         /* Nom de la filière */
      private int degre;              /* Degré */
      private int numClasse;          /* Numéro de la classe */
      private ArrayList lstEtudiants; /* Liste des étudiants de la classe */
     
      public Classe(String filiere, int degre, int nmuClasse){
      this.filiere = filiere;
      this.degre = degre;
      this.numClasse = numClasse;
      this.lstEtudiants = new ArrayList ();
      }
     
     
      public void addEtudiant (Etudiant) {
        lstEtudiants.add(Etudiant);
      }
     
      public int compteLst() {
    	  int cpt = 0;
    	  for (int i = 0; i < lstEtudiants.size() - 1; i++) {
    		  cpt++;
    	  }
    		return cpt;
    	  }
     
      public boolean equalsFD (Object obj) {
    	  return this.filiere.equals (((Classe).obj).filiere) & this.degre.equals (((Classe).obj).degre);
      }
     
     public boolean equalsF (Object obj) {
    	 return this.filiere.equals (((Classe).obj).filiere);
     }
     
     public String toString() {
    	 return filiere + degre + "-" + numClasse;
     
     
    	 if (compteLst() = 0) { return " Aucun étudiant !";
    	 else if (compteLst() > 0) { return compteLst() 
     
    	 }
     
    	 }
     
    } // Classe
    Mon problème est que je n'arrive pas à faire en sorte de découper convenablement le fichier texte pour en extraire les données afin de reproduire le type de données demandé.
    Je perds le fil et fini par plus savoir ce que je suis en train de faire…

    Merci beaucoup en tout cas.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le fichier de données n'étant pas décrit, c'est un peu difficile de savoir quoi en faire. Mais bon, à priori, il semble qu'il soit constitué de 2 parties, séparées par une ligne contenant / (une première partie à priori qui définit des classes, et une seconde partie qui définit des élèves, avec le numéro de la classe).

    Il te suffit donc de parcourir la liste de chaînes lues dans le fichier : tant que tu n'as pas trouvé de chaine égale à "/", tu traites la ligne comme définition de classe, et ensuite tu traites les lignes suivantes comme définitions d'élève.

    L'algo peut être :

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typeDecodé = classe (peut être géré avec un booléen par exemple, ou une Enum...)
    pour toutes les lignes
       si ligne égale à "/"
          alors typeDécodé = élève
       sinon si typeDecodé est classe alors
          decode ligne vers classe
          ajoute classe à liste de classes
       sinon si typeDecodé est éléve alors
          decode ligne vers élève
          chercher classe de l'élève dans liste de classes
          ajouter élève à classe trouvée
       fin si
    fin pour

    Ou

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tant qu'il reste des lignes et que la ligne courante ne contient pas "/"
          decode ligne vers classe
          ajoute classe à liste de classes
    fin tant que
    tant qu'il reste des lignes
          decode ligne vers élève
          chercher classe de l'élève dans liste de classes
          ajouter élève à classe trouvée
    fin tant que
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Informatique de Gestion
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informatique de Gestion

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut
    Bonjour,

    Tout d'abord merci pour les infos de balises ;-) ainsi que pour les idées de code que je vais tenter d'employer.
    Le fichier de données à traiter est celui-ci :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    IGS;1;3
    IGS;2;2
    IGS;3;1
    IGS;4;1
    EE;1;2
    EE;2;1
    EE;3;1
    /
    EE;1;Affolter Ryan
    EE;1;Amos Alice
    IGS;2;Baker Valentin
    EE;1;Bernet Maxime
    EE;1;Billieres Charlotte
    IGS;3;Bise Andre
    IGS;2;Blackshaw Deborah
    IGS;1;Blanco Raphael
    IGS;1;Broccard Marion
    EE;1;Bugnon Caroline
    EE;1;Bugnon Christophe
    IGS;2;Burnier Simon
    IGS;2;Catarino Marion
    EE;2;Chambaz Gabriel
    EE;3;Chambaz Henri
    IGS;3;Chappuis Adeline
    IGS;2;Constantin Gilian
    IGS;2;Daetsch Amandine
    IGS;3;Favez Lucy
    IGS;1;Favre Arthur
    EE;2;Gunther Lucile
    IGS;1;Hostettler Justine
    IGS;1;Jaccard Mandarine
    EE;2;Kaeser Florian
    EE;3;Kerr Marie
    EE;2;Kleiner Violette
    EE;1;Leclercq Jessica
    EE;2;Luisier Jeremie
    IGS;3;Matos Anais
    IGS;1;Menetrier Valentin
    IGS;2;Mossi Jean-David
    EE;1;Nichols Nicole
    IGS;1;Nogueira Sacha
    IGS;2;Nussbaum Aline
    EE;3;Pabiot Alice
    IGS;1;Perroud Cindy
    IGS;1;Piaget Juliette
    IGS;2;Reymond Alois
    EE;2;Rotman Anthony
    IGS;3;Salvignol Nathan
    IGS;1;Sandoz Flavio
    IGS;1;Sarrasin Johann
    IGS;1;Sauser Alexandre
    IGS;3;Schneider Tiago
    EE;3;Sordet Laura
    IGS;1;Sprunger Anthony
    EE;3;Stalder Emma
    EE;2;Tanner Aurore
    EE;1;Thomson Quentin
    EE;3;Varga Lauriane
    EE;1;Verrando Sandrine
    EE;1;Veuillet Aline
    EE;3;Viret Axel
    EE;2;Weibel Estelle
    EE;2;Zimmermann Nadia
    Merci pour votre aide en tout cas !
    Adrien

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    D'accord, c'est le fichier en entier, mais ça change quoi ?

    Dans ton code, tu regroupes toutes les lignes en une chaîne que tu redécoupes, par StringTokenizer. Il y'a juste une petite erreur dans le découpage de chaque ligne. Sinon, il ne te manque pas grand chose à faire : mettre les classes dans la liste de classes, avec la méthode add(), et mettre les élèves dans leur classe respective (pour ça tu peux faire une recherche séquentielle dans la liste (elle n'est pas très grande, ça ne va pas prendre beaucoup de temps), ou t'aider avec une HashMap de HashMap (clef=nom de filière, valeur=Map(clef=degre, valeur=classe)) ou (clef=(nom de filière, degré), valeur = classe).

    L'erreur dans le découpage de chaque ligne et que tu fais une boucle sur chaque token, mais tu lis tous les tokens dans le bloc de la boucle, alors qu'il faudrait lire token par token. Mais ça fonctionne quand même, certes, parce que tu lis bien tous les tokens dans le bloc.

    Je ne comprends pas la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=1; i < numClasse + 1 ; i++ ) { 
     
        Classe classe = new Classe(filiere, degre, i, ...);
     
    }
    Mais je n'ai pas la description du fichier, donc je ne peux savoir à quoi correspond le troisième nombre dans la description d'une classe. En tout cas, s'il y'a plusieurs classes par degrés, comme ta boucle le sous-entend, il est nécessaire d'avoir une règle pour placer un élève dans une des classes d'un degré (les informations d'un élève étant limité à filière et degré) : répartition avec un nombre maximum d'élèves par numéro par exemple.

    Mes proposition d'algo suggérait de traiter directement les lignes au fur et à mesure (Eventuellement, comme le fichier n'est pas très grand, tu peux lire toutes les lignes avec Files.readAllLines()). Chaque ligne est une liste de valeurs séparées par des ; (d'ailleurs au lieu d'utiliser StringTokenizer, tu pourrais procéder avec la méthode split(), ce qui t'éviterait l'erreur que j'ai citée ci-dessus).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 10
    Dernier message: 26/01/2011, 11h15
  2. Réponses: 14
    Dernier message: 13/09/2007, 12h26
  3. [D7] Créer un fichier texte de plusieurs memo
    Par dacid dans le forum Delphi
    Réponses: 5
    Dernier message: 26/06/2007, 10h58
  4. Affichage de texte en plusieurs partie dans la meme fenetre
    Par ClaudeHarvey dans le forum VBScript
    Réponses: 3
    Dernier message: 28/03/2007, 19h21
  5. Réponses: 2
    Dernier message: 02/02/2006, 18h21

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