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

Documents Java Discussion :

Importer données csv file à la base


Sujet :

Documents Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Importer données csv file à la base
    Bonjour,
    je suis entrain de créer une interface qui va uploader un fichier csv depuis un poste local vers notre serveur.
    Ce fichier contient des informations acquises depuis une station météo, En effet il s'agit de récupérer toutes ces informations et les stocker dans des tables(colonnes) de la base mysql.
    Dans un premier temps j'ai fait une servlet qui fait le upload de fichier et le stocker temporairement dans le rép /build/web/uploads/

    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
     
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
             boolean isMultipart = ServletFileUpload.isMultipartContent(request);
     
            // if the request type is multipart/form-data
            if (isMultipart) {
                //create a file upload factory and upload servlet 
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                try {
                    //parse the request List de type FileItem
                    List items = upload.parseRequest(request);
     
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                        FileItem item = (FileItem) iterator.next();
     
                        if (!item.isFormField()) {
                            String fileName = item.getName();
                            String root = getServletContext().getRealPath("/");
                            File toSave = new File(root + "/uploads");
                            if (!toSave.exists()) {
                                boolean status = toSave.mkdirs();
                            }
     
                            File uploadedFile = new File(toSave + "/" + fileName);
                            item.write(uploadedFile);
                            out.println("File "+ fileName + " is uploaded successfully at the path " + root);
     
           InputStream input =item.getInputStream();  // le fichier dans la mémoire
                      OutputStream output = new FileOutputStream("G:\\out.csv");
                           int readBytes=0;
                           long length = fileName.length();
                           byte[] bytes =  new byte[(int)length];
     
                           while((readBytes = input.read(bytes,0,(int)length)) != -1) {
                              output.write(bytes, 0, readBytes);
                           }
     
                           input.close();
                           output.flush();
                           output.close();
                           input.close();
                    }
                } 
     
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception ex) {
                    Logger.getLogger(FileUploadServlet.class.getName()).log(Level.SEVERE, null, ex);
                }  finally {
        //
            }
           }
          }
    Ce code upload avec succés le fichier dans le répertoire désigné. par contre ce fichier doit être traité et parsé avant de stoker ces informations à la base de donnée.
    Ici, je bloque.
    Toute aide est appréciée. je mets le fichier exemple en annexe
    Merci,
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Tu bloques sur quel aspect ? La lecture d'un fichier texte type CSV ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci wax78 de m'avoir répondue assez vite.
    Je pense que pour réaliser mon travail je dois :
    1. uploader le fichier
    2. récupérer le fichier uploadé
    3. parser le fichier
    3. insérer les données dans la base.

    Je bloque en voyant ce fichier example qui contient 124 colonnes, je ne sais pas comment le parser???

    Merci de votre aide.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Tu peux regarder un oeil a ce tutoriel qui t'inspirera surement : http://thierry-leriche-dessirier.dev...csv-avec-java/

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    Bonjour,
    pour lire un fichier CSV, il suffit d'utiliser un BufferedReader qui permet de lire ligne par ligne le fichier. Ensuite avec chaque ligne tu la split en indiquant "," comme séparateur et tu mets le resultat dans un tableau.
    Voici un exemple que tu peux essayer, il se contente d'afficher le resultat dans le terminal:

    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
     
    import java.io.*;
    import javax.swing.*;
    import javax.swing.filechooser.*;
    import javax.swing.filechooser.FileFilter;
     
    public class LecteurCSV {
     
     
    	JFileChooser fileChooser = new JFileChooser(new File("."));
    	FileFilter filter = new FileNameExtensionFilter("CSV File","csv");
    	File fichier;
     
    	public LecteurCSV() {
    		fileChooser.addChoosableFileFilter(filter);
    		if(fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
    			fichier = fileChooser.getSelectedFile();
    		}
    		try{
    			InputStream ips=new FileInputStream(fichier); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			String ligne;
    			int i = 1;
    			while ((ligne=br.readLine())!=null){
    				System.out.println("ligne " + i + ":");
    				String[] line = ligne.split(",");
    				for (int j=0; j<line.length;j++) {
    					System.out.println(line[j]);
    				}
    				i = i + 1;
    			}
    			br.close();
    		}
    		catch(IOException e) {
    			System.out.println(e.toString());
    		}
    	}
    	public static void main(String[] args) {
    		LecteurCSV ll = new LecteurCSV();
    	}
    }

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Tu peux regarder un oeil a ce tutoriel qui t'inspirera surement : http://thierry-leriche-dessirier.dev...csv-avec-java/
    Merci wax78 pour le lien c'est intéressent, je suis entrain de l'étudier.
    A propos en lisant ce tuto j'ai penser à extraire les données dans un ListArray comme pour liste Eleve.
    Pour récupérer les données Est-ce que je dois faire une classe DATA qui contient les propriétés suivantes:
    date,time,variableName(BATStat_1m par exemple), DataType(qui prend la valeur Min ou Max ou AVG) et Value(13.23) bref ce sont les données à récupérer du fichier. et déclarer une deuxième classe ListData List<DATA> ??? pouvez-vous me confirmer,s'il vous plait??

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci ludomacho pour ton code. Je vais m'inspirer pour rectifier mon code pour qu'il m'affiche le fichier sous la console au lieu de le copier sous un fichier out.csv

    Merci de votre aide.

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Voici mon code rectifié pour qu'il m'affiche le résultat dans le terminal. Génial je peux voir mes données avant de les insérer à la base.
    Par contre ce code marche que pour de petits fichiers, si je tente de uploader un grand fichier, il ne prend plus le fichier depuis l'inputStrem mais il va le chercher dans le dossier AppData\Local\temp\ de mon pc et il m'envoie une exception java.io.FileNotFoundException!!! Avez-vous une idée pouquoi??




    InputStream input =item.getInputStream();
    InputStreamReader ipsr = new InputStreamReader(input);
    BufferedReader br = new BufferedReader(ipsr);
    String line;
    int i=1;
    while ((line=br.readLine()) != null) {
    System.out.println("Ligne " + i +":");
    String[] cell = line.split(",");
    for(int j=0;j<cell.length;j++) {
    System.out.println(cell[j]);
    }
    i=i+1;
    }
    br.close();

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Probablement un problème de path du fichier qui devient local ou quoi ? Difficile a dire, il va te falloir debugger le chemin a chaque étape a mon avis.

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Points : 533
    Points
    533
    Par défaut
    certains hébergeurs (free par exemple) limitent le upload par http à 2Mo.
    Dans ce cas il te faudra passer par du ftp par exemple.

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'ai résolu mon problème en indiquant le path du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     String path = getServletContext().getRealPath("/");
     String filename = processRequest(request,response);  // me retourne le   fichier uploadé
     
           File file = new File(path + "/uploads/"+filename);     
           InputStream ips = new FileInputStream(file);
           InputStreamReader ipsr = new InputStreamReader(ips);
           BufferedReader reader = new BufferedReader(ipsr);
     
         ...... // reste du code
    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.2] Importation fichier CSV dans une base de données
    Par gtraxx dans le forum Langage
    Réponses: 10
    Dernier message: 21/02/2010, 15h16
  2. Code JAVA pour import données CSV
    Par tim_m dans le forum Langage
    Réponses: 11
    Dernier message: 16/11/2009, 11h55
  3. importation données csv
    Par chti_kiki dans le forum 1&1
    Réponses: 0
    Dernier message: 24/06/2009, 15h52
  4. [MySQL] Importation données csv dans mysql
    Par krfa1 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/11/2008, 09h36
  5. [MySQL] Importation données csv vers mysql via php
    Par ariel257 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/06/2008, 16h56

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