Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| public:std-3:tp1:travaux_pratiques_premiere_seance [2015/09/02 17:06] – [3. Classe Tuple] edauce | public:std-3:tp1:travaux_pratiques_premiere_seance [2015/09/02 17:27] (Version actuelle) – [6. Traitement par ''opencsv''] edauce | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== TP1 : Données structurées / Manipulation de fichiers de données ====== | ||
| + | |||
| + | Le TP sera réalisé en Java. | ||
| + | |||
| + | ====1. Introduction==== | ||
| + | |||
| + | On considère une série d’enregistrements concernant des ventes réalisées par un exportateur de véhicules miniatures. Pour chaque vente, il entre dans son registre de nombreuses informations : | ||
| + | * nom de la société cliente | ||
| + | * nom et prénom du contact, adresse, téléphone | ||
| + | * nombre d' | ||
| + | * prix de vente | ||
| + | * etc... | ||
| + | Ces informations sont stockées dans un fichier au format ‘csv’ (comma separated values) : '' | ||
| + | Récupérez ce fichier sur Claroline. | ||
| + | |||
| + | Dans un premier temps, regardez son contenu avec un editeur de texte (**'' | ||
| + | Les ligne suivantes contiennent les valeurs d’attributs correspondant à une vente donnée. | ||
| + | en tout plus de 2000 ventes sont répertoriées dans ce fichier. | ||
| + | |||
| + | Ouvrez-le maintenant à l’aide d’un tableur (par exemple **'' | ||
| + | Les données sont maintenant “rangées” en lignes et colonnes pour faciliter la lecture. | ||
| + | |||
| + | Notez bien l’emplacement du fichier '' | ||
| + | |||
| + | ====2. Lecture de fichier texte et traitement des données==== | ||
| + | |||
| + | Lancez le programme **'' | ||
| + | |||
| + | <note tip> | ||
| + | **Rappel : utilisation du logiciel Eclipse** | ||
| + | |||
| + | **Etape 1** : créer le répertoire de travail et le projet | ||
| + | Au lancement d’Eclipse, | ||
| + | d’accueil). | ||
| + | Dans l’onglet « File », sélectionnez « New », puis « Project ». | ||
| + | Choisir l’option « Java Project », puis cliquez sur « Next ». | ||
| + | Donnez un nom à votre projet (Par exemple « TP1 »), ensuite appuyez sur « Next », puis sur | ||
| + | « Finish ». | ||
| + | Votre projet est maintenant créé. | ||
| + | |||
| + | **Etape 2** : créer le/les fichier(s) du projet | ||
| + | Un projet java est constitué de plusieurs classes permettant de définir des “objets”. | ||
| + | A chaque fois que vous devez créer une nouvelle classe, allez dans l’onglet « File », puis « New » puis « Class ». | ||
| + | Donnez à votre fichier le nom de votre classe. Par exemple, “Principal”, | ||
| + | S’il s’agit de la classe principale, cochez la case « public static void main (String[] args) » afin que la classe contienne une méthode “main” qui sert de point de démarrage de votre programme. | ||
| + | Cliquez sur « Finish ». | ||
| + | Ca y est, le fichier est créé avec une classe prête à être complétée. | ||
| + | |||
| + | **Etape 3** : Une fois le programme écrit, vous pourrez exécuter l’application en choisissant l’onglet | ||
| + | « Run », puis « Run As », puis « Java Application ». | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===2.1 Ouverture du fichier=== | ||
| + | La lecture dans un fichier s’effectue avec la librairie '' | ||
| + | |||
| + | <code java> | ||
| + | import java.io.*; | ||
| + | </ | ||
| + | |||
| + | Pour pouvoir lire un fichier, il faut connaître son chemin d’accès, noté ici ''"/ | ||
| + | En Java, ce chemin est nécessaire pour créer un flux de lecture de type '' | ||
| + | Pour accéder au contenu du fichier, il faut définir un objet de type '' | ||
| + | |||
| + | <code java> | ||
| + | FileReader f = null; | ||
| + | BufferedReader g = null; | ||
| + | </ | ||
| + | |||
| + | Il est important de vérifier que l’opération d’ouverture s’effectue correctement avant de poursuivre le programme (nombreuses possibilités d’erreur : fichier effacé, erreur de nom, pas de droits de lecture, | ||
| + | On utilise une instruction de test spécifique pour vérifier que l’ouverture du fichier s’est correctement effectuée, de type '' | ||
| + | |||
| + | <code java> | ||
| + | try{ | ||
| + | f = new FileReader ("/ | ||
| + | g = new BufferedReader(f); | ||
| + | System.out.println(" | ||
| + | } | ||
| + | catch (Exception e){ | ||
| + | System.out.println(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Créez un projet Java, recopiez les lignes ci-dessus en remplaçant ''"/ | ||
| + | |||
| + | ===2.2 Lecture d’une ligne === | ||
| + | |||
| + | Comme nous l’avons vu dans l’introduction, | ||
| + | |||
| + | **Récupération de la liste des attributs :** | ||
| + | |||
| + | La première ligne du fichier contient le schéma de données. On remarque que les différents attributs sont séparés par des virgules (la virgule est donc le caractère de séparation.) | ||
| + | On souhaite afficher cette liste d’attributs. | ||
| + | |||
| + | La commande: | ||
| + | <code java> | ||
| + | String s = null; | ||
| + | try{ | ||
| + | s = g.readLine(); | ||
| + | } | ||
| + | catch (Exception e){ | ||
| + | System.out.println(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | lit une ligne du fichier et la copie dans la variable '' | ||
| + | Appliquez la commande '' | ||
| + | |||
| + | Découpage d’une chaîne de caractères | ||
| + | |||
| + | Une chaîne de caractères peut être découpée en plusieurs “morceaux”, | ||
| + | Par exemple, la commande '' | ||
| + | |||
| + | On souhaite ici découper '' | ||
| + | |||
| + | A faire : | ||
| + | |||
| + | * Définissez un tableau de chaînes de caractères '' | ||
| + | * '' | ||
| + | * Créez un entier '' | ||
| + | * puis affichez les attributs un par un (avec une boucle '' | ||
| + | |||
| + | ===2.3 Extraction d’un tuple :=== | ||
| + | |||
| + | L’objet '' | ||
| + | |||
| + | Ici, les lignes suivantes contiennent des valeurs. Commençons par lire la deuxième ligne. | ||
| + | |||
| + | * Lisez une nouvelle ligne et affichez-la. | ||
| + | * Extrayez les différentes valeurs dans un tableau nommé tab2. | ||
| + | * Affichez ce tableau élément par élément | ||
| + | * En utilisant '' | ||
| + | |||
| + | ATTRIBUT : valeur | ||
| + | |||
| + | ====3. Classe Tuple==== | ||
| + | |||
| + | Nous allons maintenant créer une classe pour gérer dans un même objet '' | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | Définissez dans votre projet cette nouvelle classe. | ||
| + | * Le constructeur initialise l’attribut '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | < | ||
| + | ATTRIBUT1 : valeur1 | ||
| + | ATTRIBUT2 : valeur2 | ||
| + | etc... | ||
| + | </ | ||
| + | Reprenez le programme principal de la question 2 en utilisant maintenant la classe '' | ||
| + | * déclarer un objet '' | ||
| + | * initialiser '' | ||
| + | * lire une nouvelle ligne et la découper, puis écrire les valeurs dans '' | ||
| + | * afficher '' | ||
| + | <code java> | ||
| + | system.out.println(t); | ||
| + | </ | ||
| + | (doit produire le même type d’affichage que dans la question précédente) | ||
| + | |||
| + | Une fois ces manipulations effectuées, | ||
| + | <code java> | ||
| + | try { | ||
| + | f.close(); | ||
| + | } | ||
| + | catch (Exception e){ | ||
| + | System.out.println(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====4. Encapsulation des opérations d’accès aux données==== | ||
| + | |||
| + | Comme nous l’avons vu, les opérations d’accès aux données nécessitent d’effectuer des tests '' | ||
| + | Pour “alléger” le programme principal, nous allons créer une classe '' | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | Ajoutez la classe '' | ||
| + | |||
| + | Pour pouvoir fournir ces services, l’objet contient un champ descripteur de type '' | ||
| + | |||
| + | PS : N’oubliez pas d’inclure la librairie des entrées/ | ||
| + | import java.io.*; | ||
| + | |||
| + | Cette classe propose les opérations suivantes: | ||
| + | * le constructeur initialise le '' | ||
| + | * La méthode '' | ||
| + | * '' | ||
| + | |||
| + | On peut éventuellement ajouter: | ||
| + | * '' | ||
| + | |||
| + | ====5. Extraction de la totalité du fichier ==== | ||
| + | |||
| + | Testons maintenant notre classe '' | ||
| + | Il est possible de lire le fichier dans sa totalité en plaçant '' | ||
| + | <code java> | ||
| + | FluxDeTuples h = new FluxDeTuples("/ | ||
| + | </ | ||
| + | et exécutez les lignes | ||
| + | <code java> | ||
| + | while (h.litTupleSuivant()!=null){ | ||
| + | | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Même si vous avez correctement programmé la méthode '' | ||
| + | |||
| + | Calculez (et affichez) le nombre de tuples incorrects. | ||
| + | |||
| + | ====6. Traitement par '' | ||
| + | |||
| + | Pour lire correctement les fichiers csv, nous ferons appel à une librairie spécialisée | ||
| + | Librairie '' | ||
| + | Récupérer et décompresser l’archive suivante: | ||
| + | http:// | ||
| + | |||
| + | Extraire le fichier '' | ||
| + | |||
| + | Pour modifier le chemin d’accès, allez dans : | ||
| + | project →properties →Java Build Path → librairies → Add external jars | ||
| + | et ajoutez le fichier indiqué. | ||
| + | |||
| + | il ne reste plus qu’à l’importer dans la classe '' | ||
| + | import au.com.bytecode.opencsv.CSVReader; | ||
| + | |||
| + | Le '' | ||
| + | |||
| + | <code java> | ||
| + | lecteurCSV = new CSVreader(descripteur); | ||
| + | </ | ||
| + | |||
| + | Grâce au '' | ||
| + | |||
| + | Pour lire un tableau de valeurs, on utilise la commande '' | ||
| + | <code java> | ||
| + | valeurs = lecteurCSV.readNext(); | ||
| + | </ | ||
| + | |||
| + | Modifiez la classe '' | ||
| + | Affichez le nombre de tuples contenu dans le fichier. | ||
| + | |||
| + | | ||