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

Entrée/Sortie Java Discussion :

[debutant] lecture d'un fichier txt de 10mo


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 18
    Points
    18
    Par défaut [debutant] lecture d'un fichier txt de 10mo
    Bonjour tout le monde,

    Voila, tous les matins je dois remplir ma base de données avec un fichier txt de 10mo environs, je dois à partir d'un clic dans un formulaire JSP récupérer un fichier qui se trouve dans c:\projet\ et dont le nom de fichier est essai.txt

    comment puis-je faire pour recuperer ce fichier et inserer tous les champs à ma base de données?

    voila deux lignes de mon fichier:
    "A","ALPS ELECTRONIC ","4970","A020148 ","LECTEUR DE DISQUETTES 1.44MO "," NS","NMS ","MAC90006 ",00000004.26,00000000.00,"Y"," "," ","9999999999999","FR",000000.48,"0509"
    "A","ALPS ELECTRONIC ","4970","A020157 ","LECTEUR DE DISQUETTES 1.44MO ","NOIR NS","PC ","DF354H121F ",00000004.25,00000000.00,"Y"," "," ","9999999999999","FR",000000.48,"0509"
    les lignes sont toutes du meme type et il y a environ 35000lignes.

    J'aimerai que le traitement soit le plus rapide possible, vu qu'il faudra mettre le site a jour tous les matins donc faudrait pas que ca prenne 45minutes.

    j'ai entendu parler de Stringbuffered de 200ko sur la fonction recherche, mais j'ai pas tout compris comment se passe le découpage, en sachant qu'une ligne de mon txt represente une ligne de ma base de données (sans les guillemets bien sur)

    mais deja j'arrive pas à lire un simple fichier et le printer dans la console.

    merci de votre aide.

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Je fais un peu le même truc que toi.
    Moi j'utilise un StrinkTokenizer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bf = new BufferedReader(new FileReader(nom));
    			String ligne;
    			while((ligne = bf.readLine())!=null)
    			{
     
    			}
    Ensuite dans le while, tu lis ligne après ligne.
    Pour séparer tes champs, je te conseils de virer tous les guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = ligne.replaceAll("\",\"",",");
    et tu découpes tes champs par StringTokenizer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringTokenizer str = new StringTokenizer(ligne);
    Pour savoir quel champs, tu n'as apparemment pas de soucis puisque tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    as un fichier bien formaté, donc tu fais :
    premier_Champs = str.nextToken(";");
    deuxieme_champs = str.nextToken(";");
    troisieme_champs = str.nextToken(";");
    ...
    etc jusqu'à ton dernier champs (qui aura la valeur 0509 pour le traitement de ta première ligne...)

    Toujours dans ta boucle while, tu fais tes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT x_champs INTO table.....
    Et ta base de donnéessera à jour!

    En éspérant que tu auras tout compris!

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par zeldoi5
    Je fais un peu le même truc que toi.
    Moi j'utilise un StrinkTokenizer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bf = new BufferedReader(new FileReader(nom));
    			String ligne;
    			while((ligne = bf.readLine())!=null)
    			{
     
    			}
    Ensuite dans le while, tu lis ligne après ligne.
    Pour séparer tes champs, je te conseils de virer tous les guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = ligne.replaceAll("\",\"",",");
    et tu découpes tes champs par StringTokenizer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringTokenizer str = new StringTokenizer(ligne);
    Pour savoir quel champs, tu n'as apparemment pas de soucis puisque tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    as un fichier bien formaté, donc tu fais :
    premier_Champs = str.nextToken(";");
    deuxieme_champs = str.nextToken(";");
    troisieme_champs = str.nextToken(";");
    ...
    etc jusqu'à ton dernier champs (qui aura la valeur 0509 pour le traitement de ta première ligne...)

    Toujours dans ta boucle while, tu fais tes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT x_champs INTO table.....
    Et ta base de donnéessera à jour!

    En éspérant que tu auras tout compris!
    J'ai tout compris sauf ce que j'ai mis en gras, en touchant un peu sous JBuilder j'avais reussi à lire un fichier dans mon java ligne par ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      public void lirefichier()  {
        try {
          FileReader in = new FileReader("c:\\essai.txt");
          BufferedReader buf = new BufferedReader(in);
          String chaine = buf.readLine();
          System.out.println("fichier ouvert");
          System.out.println(chaine);
     
        }
        catch (Exception e){
        System.out.println("impossible d'ouvrir le fichier");
        }
      }
    Le reste de ta méthode à l'air très correct, je vais tester.

    et si au passage tu peux m'expliquer l'histoire du 0509.

  4. #4
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Sinon ya aussi la classe Scanner qui te permet de faire ce genre de trucs et qui a priori est très performante.

    http://java.sun.com/j2se/1.5.0/docs/...l/Scanner.html

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Bon je vais récapituler ce que j'ai voulu t'expliquer :

    Le fait de faire un replace permet de te remplacer tous tes "," en ;, ok?

    Ensuite, ton fichier ressemble à ça :
    A;ALPS ELECTRONIC;4970;A020148;LECTEUR DE DISQUETTES 1.44MO; NS;NMS;MAC90006 ",00000004.26,00000000.00,"Y;;;9999999999999;FR",000000.48,"0509"
    A;ALPS ELECTRONIC;4970;A020157;LECTEUR DE DISQUETTES 1.44MO;NOIR NS;PC;DF354H121F ",00000004.25,00000000.00,"Y;;;9999999999999;FR",000000.48,"0509"
    Ok?
    StringTokenizer est très pratique pour découper ta chaîne, c'est pour ça que je l'utilise.

    Comme je te l'ai di, on va lire ligne par ligne :
    Après tu analyse les champs de cette ligne grace àa la classe Stringtokenizer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringTokenizer str = new StringTokenizer(ligne);
    Et ensuite (et c'est là le plus important pour toi!) :
    tu vas chopper les "bouts" qui t'intéressent dans cette ligne...
    Tu vas stocker dans le string premier_champs (enfin la variable premier_champs de type string) un bout de ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    premier_Champs = str.nextToken(";");
    Ici, ta variable premier_champs contiendra tout ce qu'il y aura dans ta ligne jusqu'au premier ; qu'elle trouvera dans la ligne.

    Par exemple, et si on prend la première ligne de ton fichier d'exemple :
    A;ALPS ELECTRONIC;4970;A020148;LECTEUR DE DISQUETTES 1.44MO; NS;NMS;MAC90006 ",00000004.26,00000000.00,"Y;;;9999999999999;FR",000000.48,"0509"
    et qu'on execute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    premier_Champs = str.nextToken("[b];[/b]"); 
    deuxieme_champs = str.nextToken("[b];[/b]"); 
    troisieme_champs = str.nextToken("[b];[/b]");
    System.out.println("Le premier champs vaut : "+premier_champs);
    System.out.println("Le deuxieme champs vaut : "+deuxieme_champs);
    System.out.println("Le troisieme champs vaut : "+troisieme_champs);
    Alors il sera affiché :
    Le premier champs vaut : A
    Le premier champs vaut : ALPS ELECTRONIC
    Le premier champs vaut : 4970

    Car, si tu n'as pas compris, ce qui sépare A de ALPS ELECTRONIC et ce qui sépare ALPS ELECTRONIC de 4970 est un point virgule ( ; )

    Tu comprends mieux l'intérêt de découper une ligne avec un séparateur précis (que tu mets dans le nextToken) ?

  6. #6
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    http://lroux.developpez.com/article/...age_2#Lscanner

    Quiconque a déjà utilisé les StringTokenizer pour découper ou parser un fichier se rend tout de suite compte de la puissance du Scanner.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 65
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par remika
    http://lroux.developpez.com/article/...age_2#Lscanner

    Quiconque a déjà utilisé les StringTokenizer pour découper ou parser un fichier se rend tout de suite compte de la puissance du Scanner.
    valable uniquement pour J2SE >= 5.0 !

  8. #8
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    oui

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par pimousse76
    Citation Envoyé par remika
    http://lroux.developpez.com/article/...age_2#Lscanner

    Quiconque a déjà utilisé les StringTokenizer pour découper ou parser un fichier se rend tout de suite compte de la puissance du Scanner.
    valable uniquement pour J2SE >= 5.0 !
    Ca doit être pour çaque je ne connais pas!
    Désolé de mon ignorance
    Je me sers des StringTokenizer parce que ej connais, maintenant je vais aller voir ce qu'il en est de ta classe scanner!

    Bonne journée, en éspérant avoir un peu aider tout de même

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Ca doit être pour ça que je ne connais pas!
    Désolé de mon ignorance Confused
    Je me sers des StringTokenizer parce que ej connais, maintenant je vais aller voir ce qu'il en est de ta classe scanner!

    Bonne journée, en éspérant avoir un peu aider tout de même
    Justement tu m'as bien aidé, j'allais chercher à decouper ma string ensuite.
    Par contre tout comme toi, la fonction scanner ne fonctionne pas, donc je ne dois pas avoir la version 5.0.

    Donc j'utilise les StringTokenizer et là pas de problème.

    edit :

    J'avais bien compris tout ce que tu as réexpliqué au dessus c'est juste le 0509 que je ne comprennais pas, mais en fait je me suis rendu compte que c'était mon dernier champ dans ma ligne

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par karamazov994
    Justement tu m'as bien aidé, j'allais chercher à decouper ma string ensuite.
    Par contre tout comme toi, la fonction scanner ne fonctionne pas, donc je ne dois pas avoir la version 5.0.

    Donc j'utilise les StringTokenizer et là pas de problème.

    edit :

    J'avais bien compris tout ce que tu as réexpliqué au dessus c'est juste le 0509 que je ne comprennais pas, mais en fait je me suis rendu compte que c'était mon dernier champ dans ma ligne
    Tu ne sais pas quel plaisir tu me donnes quand tu me dis ça!
    J'ai enfin réussi à aider quelqu'un en Java!!!! 8)

    Si t'as des soucis, n'hésite pas!
    Bon courage pour la suite
    P.S. : marque que ton problème est résolu (petit bouton en bas à gauche!)

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par karamazov994
    Justement tu m'as bien aidé, j'allais chercher à decouper ma string ensuite.
    Par contre tout comme toi, la fonction scanner ne fonctionne pas, donc je ne dois pas avoir la version 5.0.

    Donc j'utilise les StringTokenizer et là pas de problème.

    edit :

    J'avais bien compris tout ce que tu as réexpliqué au dessus c'est juste le 0509 que je ne comprennais pas, mais en fait je me suis rendu compte que c'était mon dernier champ dans ma ligne
    Tu ne sais pas quel plaisir tu me donnes quand tu me dis ça!
    J'ai enfin réussi à aider quelqu'un en Java!!!! 8)

    Si t'as des soucis, n'hésite pas!
    Bon courage pour la suite
    P.S. : marque que ton problème est résolu (petit bouton en bas à gauche!)

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/01/2007, 17h06
  2. Réponses: 4
    Dernier message: 13/11/2006, 22h30
  3. Lecture et ecriture fichier txt
    Par jeanmy dans le forum Delphi
    Réponses: 12
    Dernier message: 07/08/2006, 17h23
  4. [debutant] Lecture d'un fichier texte
    Par Tempotpo dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 09/02/2006, 15h49
  5. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 12h17

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