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 :

Lire un fichier CSV


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 38
    Points : 19
    Points
    19
    Par défaut Lire un fichier CSV
    Bonjour à tous,

    J'ai un projet à faire en Java mais je suis débutant, et je ne sais pas comment m'y prendre:
    Je dois créer un programme me permettant de lire un fichier CSV (dont on a son chemin): on m'a dit qu'une ligne de ce fichier sera rentrée dans un objet et qu'une colonne correspond à un attribut.
    On souhaite rentrer une ligne dans un objet pour ensuite en faire une liste..
    Le but à terme est de pourvoir afficher sur une page web ce fichier CSV, ainsi que de tracr des graphiques sur certains attributs,
    Comment je peux faire cela? Apparemment il existe déjà des librairies permettant de lire les fichiers CSV..

    Merci d'avance,

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 51
    Points : 71
    Points
    71
    Par défaut
    Tu peux voir du côté de easy batch... Apparemment, c'est assez pratique pour ce genre de petits traitements. Maintenant, si c'est du lourd, tente spring-batch.

  3. #3
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Regarde de ce côté, le tuto est très bien fait
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Merci pour vos réponses,
    J'ai vu qu'il existait une librairie sur Java appelée Opn-csv permettant de lire directement un fichier csv. D'ailleurs j'ai un tuto pas mal fait:
    http://thierry-leriche-dessirier.dev...ier-csv-5-min/
    Après je ne comprends pas tout,
    par exemple pourquoi dans le 3.D, il créer une classe EleveDao et le contenu de cette classe se retrouve dans le 6.B dans la casse CsvFileHelper..
    Je ne vois pas trop comment ça se fait

    Merci d'avance

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    C'est la classe CsvEleveDao qui fait le lien entre CsvFileHelper et EleveDao.

    En gros, ces trois classes se comportent comme suit:
    - EleveDao est une interface. C'est une "promesse" : elle a une méthode findEleves, elle "promet" aux classes l'utilisant qu'elle peut trouver les élèves. Les classes l'utilisant n'ont pas besoin de savoir comment elle s'y prend. C'est aussi une abstraction : l'interface ne tient pas sa promesse, elle se contente de la définir.
    - CsvFileHelper est un outil. Son rôle est la manipulation de fichier CSV. Seul, il ne sert à rien, il n'existe que pour être utilisé par d'autres classes.
    - CsvEleveDao est une implémentation de EleveDao. Son rôle est de tenir la promesse de EleveDao, elle fait ceci grâce à CsvFileHelper.
    Décomposer le problème de la sorte a un avantage : chaque classe a une responsabilité bien identifiée, ce qui facilite le débogage. Elle permet aussi de faire des modifications à une partie du code sans altérer le reste. Ainsi, si on décidait de stocker les élèves en base de données, il suffirait de créer une nouvelle implémentation de EleveDao (public class SqlEleveDao implements EleveDao etc. par exemple). Le code utilisant EleveDao ne remarquerait même pas le changement. De même, CsvFileHelper pourrait être réutilisé pour accéder à un autre fichier CSV.

    Par ailleurs, créer une classe Dao est une technique très courante en programmation. DAO signifie Data Access Object, c'est à dire une classe chargée d'accéder aux données. L'objectif est de permettre aux l'utilisant d'accéder aux élèves sans se soucier de la façon dont les élèves sont enregistrés. Et aussi de permettre au code traitant les accès aux données de ne pas être mélangé au code l'utilisant. Si vous n'en voyez pas l'utilité, c'est que vous n'avez jamais vu un même code traiter des flux vidéo tout en accédant à des fichiers texte, après, on s'étonnait que la vidéo se fige. Dans votre cas, séparer le code générant le code HTML et les graphiques de celui lisant le CSV vous facilitera la vie, je vous conseille cette méthode.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Bonjour,Merci pour vos réponses
    Je suis donc partit sur la librairie open-csv, j'ai deux classes que voici:

    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
    public class JdbProd {
      /** Date du début */
      private Date startDate_;
      /** Nom de l'article inspecté */
      private String article_;
      /** Numéro de raport */
      private String report_;
      /** Témpérature du processeur (°C) */
      private double tempCpu_;
      /** Température du système (T°C) */
      private double tempSystem_;
      /** Vitesse du ventilateur (tours/minute) */
      private double speedFan_;
      /** Valeur moyenne de l'image en début d'inspection */
      private int imageLevel_;
      /** Temps d'intégrations (mS) */
      private int integTime_;
      /** Métrage: longueur inspectée */
      private double length_;
     
     
      // METHODES
     
      /** Création des getters (accesseurs) qui permettent d'accéder aux attributs */
      //Accesseur de startDate_
      public Date getStartDate(){
        return startDate_;
      }
      //Accesseur de article_
      public String getArticle(){
        return article_;
      }
      //Accesseur de report_
      public String getReport(){
        return report_;
      }
      //Accesseur de tempCpu_
      public double getTempCpu(){
        return tempCpu_;
      }
      //Accesseur de tempSystem_
      public double getTempSystem(){
        return tempSystem_;
      }
      //Accesseur de speedFan_
      public double getSpeedFan(){
        return speedFan_;
      }
      //Accesseur de imageLevel_
      public int getImageLevel(){
        return imageLevel_;
      }
      //Accesseur de integTime_
      public int getIntegTime(){
        return integTime_;
      }
      //Accesseur de length_
      public double getLength(){
        return length_;
      }
     
      /** Création des setters (mutateurs) qui permettent de modifier les attributs */
      //Mutateur de startDate_
      public void setStartDate(Date pStartDate){
        startDate_=pStartDate;
      }
      //Mutateur de article_
      public void setArticle(String pArticle){
        article_=pArticle;
      }
      //Mutateur de report_
      public void setReport(String pReport){
        report_=pReport;
      }
      //Mutateur de tempCpu_
      public void setTempCpu(double pTempCpu){
        tempCpu_=pTempCpu;
      }
      //Mutateur de tempSystem_
      public void setTempSystem(double pTempSystem){
        tempSystem_=pTempSystem;
      }
      //Mutateur de speedFan_
      public void setSpeedFan(double pSpeedFan){
        speedFan_=pSpeedFan;
      }
      //Mutateur de imageLevel_
      public void setImageLevel(int pImageLevel){
        imageLevel_=pImageLevel;
      }
      //Mutateur de integTime_
      public void setIntegTime(int pIntegTime){
        integTime_=pIntegTime;
      }
      //Mutateur de length_
      public void setLength(double pLength){
        length_=pLength;
      }
    }
    et la deuxième:
    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
    138
    139
    140
    public class JdbReader {
     
      // ===========================================================================
      // CONSTANTES
      // ===========================================================================
     
      // ===========================================================================
      // ATTRIBUTS
      // ===========================================================================
     
      // ===========================================================================
      // METHODES
      // ===========================================================================
      /** 
       * Méthode "readData" qui a comme paramètre le chemin d'un 
       * fichier de production et le sépérateur utilisé dans le fichier csv,
       * et qui renvoie une liste de "JdbProd" issus de la classe JdbProd 
       * @throws IOException 
       * @throws ParseException 
       */
      public static List<JdbProd> readData(String pathFile, char separator) throws IOException, ParseException { 
     
        //Déclaration d'une liste qui va contenir des données de type "JdbProd"
        List<JdbProd> data=new LinkedList<JdbProd> ();
     
        //Variable qui compte le nombre de ligne lus dans le fichier CSV
        int size=0;
     
        //Déclaration d'une variable de type fichier
        File csvFile = new File (pathFile);
     
        //Utilisation de la librairie open-csv pour lire le fichier CSV passé en paramètre
        FileReader fr=new FileReader (csvFile);
        CSVReader csvReader=new CSVReader(fr,separator,'\0','\0');
     
        //Initialisation d'un tableau appelé nextLine
        String nextLine[] = null;
     
        //On parcourt le fichier tant qu'il n'est pas vide
        while((nextLine=csvReader.readNext())!= null)
        {
          //Instanciation d'un objet
          JdbProd jdbProd = new JdbProd ();
     
          //Si ce n'est pas la première ligne, on met dans l'objet --> permet de ne pas prendre en compte l'en-tête des colonnes
          if (size!=0)
          {
            //try
            //{
            //Conversion d'un String en date:
            //Déclaration d'un format de date avec l'heure
            SimpleDateFormat formatter=new SimpleDateFormat ("dd/MM/yyyy hh:mm:ss");
            //Concaténation de la date et de l'heure de l'inspection
            jdbProd.setStartDate (formatter.parse (nextLine[0]+ " " + nextLine[1]));
            //Gérer exception due au format de date
            //}
            //catch (ParseException e)
            //{
            // e.getStackTrace ();
            //}
     
            //On ne gère pas d'exceptions car c'est du String donc même si cellule vide="" c'est considéré comme du String
            jdbProd.setArticle (nextLine[4]);
            jdbProd.setReport (nextLine[3]);
     
            //On essaye de lire la température du processeur + cas exception
            try
            {
              //Conversion d'un string en double:
              jdbProd.setTempCpu(Double.parseDouble(nextLine[7]));
            }
            catch(NumberFormatException|ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setTempCpu(0.00); //Valeur nulles par défaut
            }
     
            //On essaye de lire la température du système + cas exception
            try
            {
              jdbProd.setTempSystem(Double.parseDouble(nextLine[8]));
            }
            catch(NumberFormatException |ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setTempSystem(0.00);
            }
     
            //On essaye de lire la donnée vitesse du ventilo + cas exception
            try
            {
              jdbProd.setSpeedFan(Double.parseDouble(nextLine[11]));
            }
            catch(NumberFormatException |ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setSpeedFan(0.00);
            }
     
            //On essaye de lire le métrage inspectée + cas exception
            try
            { 
              jdbProd.setLength (Double.parseDouble(nextLine[20]));
            }
            catch(NumberFormatException |ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setLength(0.00);
            }
     
            //On essaye de lire la valeur moyenne de l'image + cas exception
            try
            {
              //Convertir des String en Integer:
              jdbProd.setImageLevel(Integer.parseInt (nextLine[16]));
            }
            catch(NumberFormatException |ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setImageLevel (0); //0 valeur par défaut
            }
     
            //On essaye de lire le T.I + cas exception
            try
            {
              jdbProd.setIntegTime(Integer.parseInt (nextLine[17]));
            }
            catch(NumberFormatException |ArrayIndexOutOfBoundsException e)
            {
              jdbProd.setIntegTime(0);
            }
     
            //On ajoute un élement du type jdbProd 
            data.add(jdbProd);
          }
          size+=1; //Incrémentation
        }
     
        //On ferme le fichier
        csvReader.close();
     
        //La fonction renvoie la liste contenant des données JdbProd
        return data;
      }
    }
    Voilà, j'ai fait ce que j'ai pu en tant que débutant et ça marche plutôt bien. Maintenant j'ai une question, c'est comment je peux tester la première colonne de la première ligne pour voir si c'est un en tête (string-->en tête et si c'est une date c'est des données directement et pas d'en tête)
    Merci d'avance!!

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    SimpleDateFormat#parse lance une ParseException si le texte n'est pas une date valide, vous pouvez donc utiliser un bloc try catch.

  8. #8
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    un perfectionnement de l'exemple cité serait de le faire fonctionner en "flot" (soit avec un Iterateur soit avec les stream java 8).
    L'idée serait de ne pas charger le résultat de toutes les lignes en mémoire mais de les charger/traiter une à une
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 38
    Points : 19
    Points
    19
    Par défaut
    Re,
    merci pour votre aide,
    je suis en effet partie sur le try{}, catch{} avec le parseException

Discussions similaires

  1. Lire un fichier .csv sous unix
    Par bslota dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/11/2007, 17h41
  2. Ouvrir et lire un fichier .csv
    Par Art19 dans le forum Composants VCL
    Réponses: 20
    Dernier message: 12/08/2007, 23h18
  3. Lire un fichier CSV ou XLS de la même manière
    Par Linio dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/07/2007, 15h12
  4. Réponses: 12
    Dernier message: 12/04/2006, 10h20
  5. Lire un fichier CSV/XLS
    Par Doneve dans le forum ASP
    Réponses: 3
    Dernier message: 04/10/2005, 17h34

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