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 :

lecture de fichier de plus de 3000 lignes


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 28
    Points : 24
    Points
    24
    Par défaut lecture de fichier de plus de 3000 lignes
    Bonjour tout le monde,

    Voila je suis developpeur mais novice en java,

    j'ai ecrit une classe qui permer de lire un fichier qui contient des information sur des etudiants et de ecrit un nouveau en format csv.

    Mon programme marche correctement mais si je lit un fichier avec plus de 3176 ligne j'ai une exception "java.lang.StringIndexOutOfBoundsException".

    je doute que la taille du BufferedReader est depassée, je ne sais pas si ce que je dit est logique.

    mon code est :

    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
     
     
    package tn.com.medianet;
     
    import java.util.*;
     
    import java.io.*;
     
     
    public class FileInput {
     
      public static void main(String[] args) {
     
    	 int v = convertToLdr("C:\\oou\\ETUDIANT.TXT", "C:\\oou\\exprt.txt");
     
     
      }
     
      public static int  convertToLdr(String fileIn, String fileOut){
     
    	    String exportFile =  fileOut;
     
    	    File file = new File(fileIn);
    	    FileInputStream fis = null;
    	    BufferedInputStream bis = null;
    	    DataInputStream dis = null;
     
    	   //pour mesurer la durée d'execution
     
    	    Calendar m_start = new GregorianCalendar();
    		Calendar m_stop = new GregorianCalendar();	
    		m_start.setTime(new Date());
     
    	    try {
     
    	    	//fichier d'export 
    	    	FileWriter fw = new FileWriter(exportFile, true);
    	   		BufferedWriter output = new BufferedWriter(fw);
     
     
    	      fis = new FileInputStream(file);
     
    	      	// Here BufferedInputStream is added for fast reading.
    	      bis = new BufferedInputStream(fis);
    	      dis = new DataInputStream(bis);
     
    	      	// dis.available() returns 0 if the file does not have more lines.
     
    	      int i = 1;
    	      String ligne, nom, bac, cin, prenom, date_n, sexe, delegation, gouvernorat,tour, 
    	      filiere, profil, foyer, date_limite,  ligneCsv ;
     
    	      while (dis.available() != 0) {
     
    	    	// this statement reads the line from the file and print it to
    	        // the console.
     
    	    	 ligne =dis.readLine();
     
    	    	 bac = ligne.substring(0,6).trim();
    	         cin = ligne.substring(6,14).trim();
    	         nom = ligne.substring(14,32).trim();
     
    		     prenom = ligne.substring(32,49).trim();
    		     date_n = ligne.substring(49,57).trim();
    	         sexe = ligne.substring(57,58).trim();
    	         delegation = ligne.substring(58,60).trim();
    	         gouvernorat = ligne.substring(60,62).trim();
    	         tour = ligne.substring(62,63).trim();
    	         filiere = ligne.substring(63,68).trim();
    	         profil = ligne.substring(68,69).trim();
    	         foyer = ligne.substring(69,70).trim();
    	         date_limite = ligne.substring(70,78).trim();
     
    	         ligneCsv = bac+"|"+cin+"|"+nom+ "|"+prenom+"|"+date_n+"|"+sexe+"|"+delegation+"|"+gouvernorat+
    	         			"|"+tour+"|"+filiere+ "|"+profil+"|"+"|"+foyer+"|"+date_limite+ "|"+"\n";
     
     
    	      /* System.out.println("bac  :"+bac+"-- cin   :"+cin+"-- nom  :"+nom+
    	    		   "---prenom:"+prenom+"---date_n:"+date_n+"--sexe:"+sexe+
    	    		   "---delegation:"+delegation+"--gouvernorat:"+gouvernorat);
     
    		*/	
     
     
    	        i++;
     
    	        output.write("ligne :"+i+" --"+ligneCsv);
    	        output.write(ligne+"----longueur :"+ligneCsv.length()+"\n");
     
     
    	      }
     
    	      	// dispose all the resources after using them.
    	      fis.close();
    	      bis.close();
    	      dis.close();
     
    	      output.flush();
    			output.close();
     
    	    } catch (FileNotFoundException e) {
    	      e.printStackTrace();
    	      return 0;
    	    } 
    	    catch (IOException e) {
    		      e.printStackTrace();
    		      return 0;
    		 }
     
     
     
     
    	    m_stop.setTime(new Date());
     
    	    System.out.println("Temps d'exécution : " + (m_stop.getTimeInMillis() - m_start.getTimeInMillis()) + " ms");
     
    		return 1;
     
     
      }
     
    }

    les lignes du fichier sources on la structure :
    Num Bac (6 caracteres numeriques).
    Num Cin (8 caracterees non controlés)
    Nom (18 caracteres alpha)
    Prenom (17 caracteres alpha)
    Date de naissance (8 caracteres : jjmmaaaa)
    Sexe (1 caractere 'M/F' )
    Delegation (2 numeriques caracteres)
    Gouvernorat (2 numeriques caracteres)
    Tour d'orientation ( 1 caract num)
    Filiere d'orientation (5 caracteres num)
    Profil etudiant (1 caractere)
    Code foyer ( 4 caractere alpha num : 1caractere soit N soit C soit S pour dire que
    c un foyer du Nord ou centre ou sud et 3 Caracteres num code interne)
    Date limite d'admission dans le foyer ( 8 cartactere jjmmaaaa)

    merci d'avance;

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Je crois que tu analyses mal ton problème...

    Le StringIndexOutOfBoundsException vient d'un de tes subString: une des lignes de ton fichier (au hazard la 3177ème si c'es elle qui pose problème) fait moins de 78 caractères => un des subString lève cette exception.

    Vérifie donc que ta ligne est assez longue et permet bien d'effectuer un subString(). Sinon, au choix:
    - tu complètes la ligne avec le nombre de caractères nécessaires
    - tu considères que la ligne est mal formattée et tu l'ignores (la bonne solution à mon avis: tu ne sais pas quel champ est manquant si ta ligne n'a pas la bonne taille et tu ne peut donc pas la parser correctement)

    Au passage, java gère sans problème des fichiers de 3000 lignes... En ce moment, je travaille avec une base de données sous forme de fichiers indexés: je parse donc les différents champs comme toi à l'aide subString(). Ca fonctionne sans problème sur des fichiers de plus de 30.000 lignes!
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Merci de ta reponse mais toutes les lignes on la meme longeurs 81 carateres

    j'ai tester l'erreur se trouve a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bac = ligne.substring(0,6).trim();
    juste apres
    le probleme est que l'erreurs se declanche que quelque lignes apres la 3100 ieme ligne

  4. #4
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Je pense que la ligne qui plante est une ligne vide. Affiche la sur la console pour être sûr.

    A+
    Hydraland

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    rebonjour,

    en fait j'ai resolu mon probleme mais je ne comprend rien,

    tout ce que j'ai fais est que j'ai supprimer 2 retour à la lignes qui se trouvait à la fin du fichier à aptir du quel je lisait les données est tout fonctionne correctement et si je les remet je retombe dans la meme exception ,

    est ce que vous pouvez expliquer ça ??

  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
    Ba voilà :
    Citation Envoyé par hydraland
    Je pense que la ligne qui plante est une ligne vide.
    A priori tu gères mal les lignes vide.
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  7. #7
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Normal; Tu demandes à Java de lire ligne par ligne, et tu ne testes pas la taille en amont de la ligne, sur laquelle tu appliques des substrings -> Erreur !

    En ajoutant un test sur la taille pour qu'elle soit égale à la taille que tu attends, tu n'aurais eu aucun problème, et ton script aurait même fonctionné avec des sauts de lignes parasites en plein milieu

    A+
    K

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Merci à tous,

    en testant sur les logueurs des lignes j'ai resolu le probleme

    à bien tot avec des question de novice.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/08/2014, 13h40
  2. Lecture du fichier le plus récent d'un sous-dossier en Java
    Par FayssalJava dans le forum Général Java
    Réponses: 3
    Dernier message: 17/03/2014, 14h20
  3. PEUT ON IMPORTER FICHIER EXCEL PLUS DE 1000 LIGNE?
    Par omarnigth dans le forum Deski
    Réponses: 0
    Dernier message: 04/08/2012, 05h49
  4. Lecture de fichiers de plus de 4Go
    Par nulloz dans le forum Linux
    Réponses: 8
    Dernier message: 07/10/2008, 22h18

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