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 16:40] – [2. Lecture de fichier texte et traitement des données] 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. | ||
+ | |||
+ | | ||