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

avec Java Discussion :

recuperer 3 int depuis fichier txt et les inserer en tant qu'objet Date


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut recuperer 3 int depuis fichier txt et les inserer en tant qu'objet Date
    bonsoir,

    J'ai recupere l'enoncé d'1 exo à cette adresse
    https://www.developpez.net/forums/d2.../avis-experts/

    il faut lire un fichier texte qui possede x enregistrements d'1 cpie de vols
    je vs mets 1 L
    14567 Toronto 12 04 2002 167

    - n° du vol
    - destinat° du vol
    - jour du vol
    - mois du vol
    - année du vol
    - nbre de reservations

    il faut creer 3 classes
    - 1 classe Date avec les 3 entiers
    - 1 classe Vol
    - 1 classe GestionVols

    j'ai ecrit les 2 1° classes.
    j'ai dc
    - des instances de type Date
    - des instances de type Vol

    Mon constructeur Vol est composé de parametres dt 1 est de type Date.
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Vol(int p_numeroDuVol, String p_destinationDuVol, Date p_dateDeDepartDuVol, int p_nombreTotalDeReservations) {
     
    		this.numeroDuVol = p_numeroDuVol;
    		this.destinationDuVol = p_destinationDuVol;
    		this.dateDeDepartDuVol = p_dateDeDepartDuVol;
    		this.nombreTotalDeReservations = p_nombreTotalDeReservations;
    	}
    Ds la classe GestionVols, je dois ecrire 1 methode qui
    - lit le fichier texte
    - recupere les vols
    - les stocke ds 1 tableau -- j'ai choisi 1 List<Vol> vols = new ArrayList<Vol>();

    Ma question,
    Comment est-ce que je peux
    - lire le fichier (je pense utiliser la classe Scanner, parmi les 3 moyens de lire 1 fichier txt)
    - recuperer chaque L
    - transformer mes 3 int (jour, mois, année) en 1 objet de type Date pr ensuite
    - inserer
    le n° du vol, la destination du vol, la date du vol et le nbre de reservations ds mon ArrayList

    Voilà, j'espere avoir clairement exposé mon problème. Je peux mettre ce que j'ai écrit a disposition, ce n'est pas tres long.
    Bonne soirée
    grub

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 324
    Points : 435
    Points
    435
    Par défaut
    Ma question,
    Comment est-ce que je peux
    - lire le fichier (je pense utiliser la classe Scanner, parmi les 3 moyens de lire 1 fichier txt)
    - recuperer chaque L
    - transformer mes 3 int (jour, mois, année) en 1 objet de type Date pr ensuite
    - inserer
    le n° du vol, la destination du vol, la date du vol et le nbre de reservations ds mon ArrayList
    En effet, Scanner peut-être pratique pour lire et parser chaque ligne de votre fichier mais il faut prendre en compte les cas d'erreurs et le code devient parfois fort "encombré". Un autre solution est de lire chaque ligne et d'utiliser une expression régulière pour vérifier si elle correspond au format attendu avant d'extraire les données via des groupes (nommés).

    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
    // 100% Scanner 
       int day = scanner.nextInt();
       // Que fait'on si il n'y à plus de Int ?
       int month = scanner.nextInt();
       int year = scanner.nextInt();
       scanner.nextLine();
     
       // Scanner et Regex
       String line = scanner.nextLine();
       Matcher match = Pattern.matcher(line);
       if ( matcher.find() ) {
         int day = match.group("day");
         int month = match.group("month");
         // ...
       } else {
         // ligne incorrecte
       }
    Lorsque vous avez les valeurs primitives, il ne reste qu'a instancier vos classes et les ajouter dans la collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      vols.add(new Vol(..., new Date(day, month, year), ..));

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Bonjour gervais.b

    j'ai terminé l'exercice ce matin.

    En premier lieu, j'explique comment j'ai résolu mes problèmes précédents, ensuite j'exposerai 2-3 petites questions.

    Pr la classe Scanner
    Je creé 1 premier objet de type Scanner dt je me sers pour lire l'entrée utilisateur -> ok, pas de probleme
    et là... bétise je ferme l'objet Scanner (Eclipse m'indique une fuite de ressource).
    Comme j'ai plusieurs entrées utilisateur, je crée plusieurs objets de type Scanner MAIS puisque je les ferme, je me retrouve avec des exceptions
    "NoSuchElementError" (ou qque chose d'approchant, d'apres mes souvenirs) (a priori la fermeture d'1 objet Scanner ferme le System.in)
    Après recherche, il y a, apparemment 2 solutions possibles
    - Ne jamais fermer les objets de type Scanner (ce que j'ai fait ms je ne pense pas que ce soit une solut° satisfaisante)
    - creer 1 seul objet de type Scanner et le declarer en tant que objet (attribut?) de classe (en static donc) et réutiliser ce meme objet
    pr lire ttes les entrées utilisateur. (solut° la + élégante je pense, plus lisible aussi (moins de code encombré comme vs dîtes) et moins de
    "fuites de ressources" je pense)
    Il faut que j'essaye cette opt°, histoire d'améliorer la qualité de mon code.
    Je n'ai pas non plus encore ecrit le traitement des exceptions, je dois m'en occuper.

    Ensuite pr la lecture fichier et la recherche et récupérat° des infos, j'ai fait ce que vs avez indiqué.
    1 objet Scanner et 1 boucle while pr la lecture du fichier
    1 ArrayList pr contenir chaque ligne du fichier
    1 boucle for pr récuperer selon 1 pattern regex, les infos dt j'avais besoin
    et du substring pr récuperer le jour, le mois et l'année
    Le code
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    public static void f03ChargerVols() {
     
    		System.out.println("f03ChargerVols");
    		System.out.println("\n");
     
    		// definir le fichier a lire
    		File file = new File("/home/grub/Documents/java/Exercices_a_faire/01_gestion_des_vols/Cie_Air_Relax.txt");
     
    		try {
    			// cree 1 objet de type Scanner
    			Scanner scanFile = new Scanner(file);
     
    			// definit 1 List de type ArrayList qui n'accepte
    			// que des String
    			List<String> liste = new ArrayList<String>();
     
    			// boucle pr lire le fichier
    			while(scanFile.hasNext()) {
     
    				// ajoute chaque ligne du fichier
    				// ds la ArrayList
    				liste.add(scanFile.nextLine());
    			}
     
    			// boucle pr agir sur chaque element
    			// contenu desormais ds la ArrayList
    			// on extrait les 4 informat° necessaires
    			// - le n° du vol
    			// - la destinat° du vol
    			// - la date du vol
    			// - le nbre de reservat° du vol
    			for(int i = 0; i < liste.size(); i++) {
     
    				// affichage de chaque elt complet de la ArrayList
    				// 1 elt de cette liste = 1 L du fichier texte
    				// System.out.println(liste.get(i));
     
    				// definir la source a traiter
    				// (ici, Les L 1 a 1 de la ArrayList)
    				String source = liste.get(i);
     
    				// variables pr pvoir modifier
    				// le type (de String en int)
    				// des infos extraites depuis la
    				// ArrayList
    				// (initialisat° des variables obligatoire?)
    				int intNumeroDuVol = 0;
    				String destinationDuVol = "";
    				Date d = null;
    				int intNombreDeReservations = 0;
     
    				// variables de type Pattern regex pr extraire les donnees
    				Pattern pNumeroDuVol = Pattern.compile("(^[0-9]+)");
    				Pattern pDestination = Pattern.compile("([a-zA-Z-\\p{L}]+ [a-zA-Z-\\p{L}]+ [a-zA-Z-\\p{L}]+|[a-zA-Z-\\p{L}]+ [a-zA-Z-\\p{L}]+|[a-zA-Z-\\p{L}]+)");
    				Pattern pDateDuVol = Pattern.compile("((?:[0-9][0-9] [0-9][0-9] [0-9][0-9][0-9][0-9]))");
    				Pattern pNombreDeReservations = Pattern.compile("([0-9]+$)");
     
    				// variables de type Matcher pr etablir la
    				// correspondance avec les pattern regex ci-dessus
    				Matcher mNumeroDuVol = pNumeroDuVol.matcher(source);
    				Matcher mDestination = pDestination.matcher(source);
    				Matcher mDateDuVol = pDateDuVol.matcher(source);
    				Matcher mNombreDeReservations = pNombreDeReservations.matcher(source);
     
    				// extrait le n° du vol de la L
    				if(mNumeroDuVol.find()) {
    					// System.out.println("Numero du vol: " + mNumeroDuVol.group(0));
    					String numeroDuVol = mNumeroDuVol.group(0);
     
    					// modificat° du type de la donnee
    					intNumeroDuVol = Integer.parseInt(numeroDuVol);
    				}
    				// extrait la destination du vol de la L
    				if(mDestination.find()) {
    					// System.out.println("destination du vol: " + mDestination.group(0));
    					destinationDuVol = mDestination.group(0);
    				}
    				// extrait la date, le jour, le mois et l'annee du vol de la L
    				// modifie le type (de String en int) des 3 dernières infos
    				if(mDateDuVol.find()) {
    					// System.out.println("date du vol: " + mDateDuVol.group(0));
    					// System.out.println("jour du vol: " + mDateDuVol.group(0).substring(0, 2));
    					String jourDuVol = mDateDuVol.group(0).substring(0, 2);
     
    					// modificat° du type de la donnee
    					int intJourDuVol = Integer.parseInt(jourDuVol);
     
    					// System.out.println("mois du vol: " + mDateDuVol.group(0).substring(3, 5));
    					String moisDuVol = mDateDuVol.group(0).substring(3, 5);
     
    					// modificat° du type de la donnee
    					int intMoisDuVol = Integer.parseInt(moisDuVol);
     
    					// System.out.println("Annee du vol: " + mDateDuVol.group(0).substring(6, 10));
    					String anneeDuVol = mDateDuVol.group(0).substring(6, 10);
     
    					// modificat° du type de la donnee
    					int intAnneeDuVol = Integer.parseInt(anneeDuVol);
     
    					// creat° d'objets de type Date
    					// on est tjs ds la boucle for)
    					d = new Date(intJourDuVol, intMoisDuVol, intAnneeDuVol);
    				}
    				// extrait le nbre de resa du vol de la L
    				if(mNombreDeReservations.find()) {
     
    					// System.out.println("Nbre de resas du vol: " + mNombreDeReservations.group(0));
    					String nombreDeReservations = mNombreDeReservations.group(0);
     
    					// modificat° du type de la donnee
    					intNombreDeReservations = Integer.parseInt(nombreDeReservations);
    				}
     
    				// creat° d'objets de type Vol
    				// (on est tjs ds la boucle for)
    				Vol v = new Vol(intNumeroDuVol, destinationDuVol, d, intNombreDeReservations);
     
    				// remplit la List (ArrayList) qui
    				// stocke les vols
    				vols.add(v);
     
    			}
     
    			// ferme l'objet de type Scanner
    			// scanFile.close();
     
    			// ferme le fichier
    			// peut etre qu'il est fermé automatiquement
    			// TODO: verifier si la fermeture du fichier est necessaire
     
    		}
     
    		catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    Ensuite, oui les methodes
    - add()
    - set()
    - remove()
    de la ArrayList.

    Voilà.
    pas mal galéré sur la recherche regex pattern.
    Le reste est "assez" facile

    Note:
    je n'ai pas fait d'affichage graphique, mais des menus console.

    Maintenant 2-3 questions
    - 1 connaissance qui fait du dvpt Java en professionnel me dit qu'il n'utilise aucune des bibliotheque graphique java (pas de swing, pas d'AWT) ms qu'il utilise Javascript.
    Si je ne me trompe pas, cela implique 1 framework type Node.js ou React (ou 1 autre que je ne connais pas)?

    - Ds l'enoncé de l'exercice il n'est pas mentionné qu'il faille faire les verifs de base (l'utilisateur entre t-il bien 1 int qd nécessaire ou au bon format... etc, etc).
    Si je m'en tiens strictement a l'énoncé de l'exercice, les verifications st elles demandées implicitement ou je peux les ignorer (gain de temps pr realiser l'exercice)?

    - je ne connais pas votre niveau (etes vs professionnel, depuis combien de temps, faites vs du dvpt informatique? combien de temps en Java, etc, etc)
    pr 1 débutant (pas forcement doué, pas forcément sous-doué), qui se colle à Java depuis 3 semaines, je viens de faire cet exercice en 4 jours (sans etre en "temps complet").
    Trouvez vous mon temps de realisation, raisonnable ou pas bon?

    Voilà, pas plus,
    l'exo est fait, faut que je le revoie un peu et ensuite je passe a autre chose.

    En vous remerciant pr votre reponse,
    grub

Discussions similaires

  1. [OpenOffice][Base de données] Récupérer les données d'un fichier .txt et les insérer dans une base de données
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 05/08/2009, 11h52
  2. Script Shell et update BD depuis fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 10/07/2008, 23h22
  3. Réponses: 5
    Dernier message: 20/06/2008, 00h03
  4. Réponses: 5
    Dernier message: 04/12/2007, 00h45
  5. Importer deux fichiers .txt et les mettres en corréalation !
    Par NoRKi dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/09/2006, 23h28

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