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

avec Java Discussion :

Problème dans mon code


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut Problème dans mon code
    Bonjour tout le monde, cela fait a peu pres 1 semaine que j'apprend le java, et je suis actuellement entrain de codé un logiciel qui devrait me permettre de tronquer des chaines de caracteres a un endroit précis.
    Explications :
    J'ai un fichier texte qui est constitué d'exactement 310 caracteres par ligne.
    On attend de mon logiciel qu'il coupe ces 310 caracteres afin que je puisse l'insérer dans une base de donnée ensuite.
    exemple :
    Mon fichier texte de 310 caractere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
    Ce que je voudrais que mon logiciel fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zzz;zz;zzzz;zzzzzzzzzzz;zz;zzzzzzzzzzzzzzzzzzzzzz;zzzzzzz;zzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzz;zzzzzzzzzzzz;zzzzzz;zzzz
    Comme il n'y a aucun séparateur dans ce fichier texte, je n'ai pas trouver d'autre moyen que de devoir insérer des ";" en guise de séparateur. (je ne sais pas si il y a un moyen plus facile, perso c'est le seul que j'ai trouvé)

    Mon logiciel fonctionne très bien pour la premiere ligne de mon fichier, mais des qu'il passe a la 2e ligne, on dirait qu'il compte a partir de 3, puis 5, puis 7 ...

    Voici mon code :

    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
    public class lire {
     
      private static int n;
     
    public static void main(String[] args) throws IOException {
     
    ArrayList al1= new ArrayList();      // cette liste contient tout les emplacements exacte où il faut mettre un ";"
    al1.add(3);   // Apres le 3e carac 
    al1.add(3);   //puis apres 3 carac
    al1.add(1);	  //puis 1 ...
    al1.add(6);
    al1.add(4);
    al1.add(2);
    al1.add(9);
     
    al1.add(2);
    al1.add(4);
    al1.add(8);
    al1.add(30);
    al1.add(65);
    al1.add(1);
    al1.add(47);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(85);   //ce qui nous fait 310 caracteres
     
    FileInputStream fis = null;
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test2.txt", true));
     
    try {
     
        fis = new FileInputStream(new File("test.txt"));
     
        byte[] buf = new byte[8];       // Je n'ai trouvé que cette méthode pour lire caractere par caractere
     
        int n = 0;
     
        int compteurCaractere = 0;     // a chaque caractere ecrit, ce compteur fait son travail
        int compteurCaractere2 = 0;    // ce compteur compte jusqu'au 310e caractere, pour que je sache quand j'ai fini la ligne
        int compteurAl1 = 0;              //compteur qui me permet de naviguer dans mon arraylist afin de placer les ";"
     
        while ((n = fis.read(buf)) >= 0) {
        for (byte bit : buf) {
     
        	   bufferedWriter.write((char)bit);// j'ecris ce qu'a lu la boucle au format char
        	   System.out.print( (char) bit);
     
              compteurCaractere += 1;
              compteurCaractere2 +=1;
     
              	if ( compteurCaractere ==(int) al1.get(compteurAl1)){ //si le compteur = 1er element de mon arraylist, je réinitialise compteur,
              														  //et j'ajoute 1 a compteurAl1 pour passer au 2e element de mon array .. etc
              			bufferedWriter.write(";");	
              			System.out.print(";");
              		//fos.write(10);
     
              			compteurCaractere = 0;
              			compteurAl1 += 1;
              		 /*if (compteurAl1 == 20){
              			 
              			 compteurCaractere =0;
              			 compteurAl1 = 0;
              		 }*/
     
              	}
              if ((compteurCaractere2 == 310) && (compteurAl1 == 20) ){ //si j'arrive au 310e caractere ou que je suis au bout de mon Arraylist
              			//compteurCaractere = 0; 
              			compteurAl1 = 0;                                //je reviens au debut de mon Arraylist
              			compteurCaractere2=0;                           //je réinitialise mon compteur de caractere
              			};
     
     
           }
           //je réinitialise le buffer à vide
           //au cas où les derniers byte lus ne soient pas un multiple de 8
           //Ca me permet d'avoir un buffer vierge à chaque lecture et ne pas avoir de doublon en fin de fichier
           buf = new byte[8];
     
       }
        System.out.println("Copie terminée !");
        bufferedWriter.close();
     } catch (FileNotFoundException e) {
        // Cette exception est levée si l'objet FileInputStream ne trouve
        // aucun fichier
        e.printStackTrace();
     } catch (IOException e) {
        // Celle-ci se produit lors d'une erreur d'écriture ou de lecture
        e.printStackTrace();
     } finally {
        // je ferme les flux de données dans un bloc finally pour s'assurer
        // que ces instructions seront exécutées dans tous les cas même si
        // une exception est levée !
        try {
           if (fis != null)
              fis.close();
        } catch (IOException e) {
           e.printStackTrace();
        }
      }
      }}
    Je trouve que mon code est correct, pourtant voici ce qu'il renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    zzz;zzz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;
    z;zzz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zz
    ;
    zz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzz;z
    Ce que je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    zzz;zzz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;
    zzz;zzz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;
    zzz;zzz;z;zzzzzz;zzzz;zz;zzzzzzzzz;zz;zzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;z;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzz;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz;

    comme vous pouvez le voir, la premiere ligne est bien coué tout les 3/3/1/6/4/2... caracteres
    Mais la 2e ligne est coupé apres 1/3/1/6/4/2..
    et la 3e tout les 2/1/6/4/2..
    Comme si il décalait de +2 caracteres a chaque ligne. j'ai pensé a un caractere invisible comme le \n
    Mais je ne trouve pas de solution
    N'hésiter pas a me dire si il y a des méthodes beaucoup plus simple pour insérer un caractere, ou si il y a une méthode plus simple de remplir son ArrayList, et je suis surtout perdu au niveau de la lecture/ecriture, il y a tellement d'outil ..
    Merci d'avance pour votre aide

  2. #2
    Membre très actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Par défaut
    Hello,

    ne serait-ce pas ce fameux "caractère de fin / saut de ligne" (\n) qui serait pris en considération lors du découpage de tes lignes ?
    Cela paraît donc normal qu'il y ait ce décalage de 2 caractères !

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Le problème de ton code, c'est qu'il est bien trop compliqué.

    Approche plus simple :
    - lire le fichier ligne par ligne (et non pas octet par octet)
    - pour chaque ligne, calculer ce qu'il faut écrire à la place de cette ligne
    - écrire le résultat dans le fichier de sortie.

    Pour lire un fichier ligne par ligne, la FAQ Java répond à ce genre de questions, pas de risque de se noyer dans les possibilités.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Par défaut
    Salut essaye ca.
    Je te laisse le soin de faire la fonction pour ecrire dans le fichier texte
    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
    public class Lire {
     
      private static int n;
     
    public static void main(String[] args) throws IOException {
     
    ArrayList al1= new ArrayList();      // cette liste contient tout les emplacements exacte où il faut mettre un ";"
    al1.add(3);   // Apres le 3e carac 
    al1.add(3);   //puis apres 3 carac
    al1.add(1);	  //puis 1 ...
    al1.add(6);
    al1.add(4);
    al1.add(2);
    al1.add(9);
    al1.add(2);
    al1.add(4);
    al1.add(8);
    al1.add(30);
    al1.add(65);
    al1.add(1);
    al1.add(47);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(8);
    al1.add(85);   //ce qui nous fait 310 caracteres
     
    Scanner scanner = new Scanner(new File("test.txt"));
    // On boucle sur chaque champ detecté
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        String tutu = "";
        int comp2 = 0;
        int comp = 0;
        for (int i = 0 ;i<al1.size();i++){
     
            int t = (int) al1.get(i);
             comp2 += t;
            tutu += line.substring(comp, comp2) + ";";
            comp = comp2;
     
        }
     
     
        System.out.println(tutu);
    //ecrire dans test2.txt
    }
     
    scanner.close();
     
      }}

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Entre parenthèses, pourquoi utiliser une liste pour stocker les tailles de découpage ?

    C'est plus clair et lisible comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] tailles = { 3, 3, 1, 6};
    Sans parler du parcours, également plus simple et lisible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int taille : tailles ) {
     
        comp2 += taille; 
     
        ...
     
    }
    (je ne parle pas des multiples concaténations de String qu'on devrait gérer avec un StringBuilder, le propos n'étant peut-être pas à ce niveau, mais par habitude, dans ce genre de boucle, y penser, voire carrément écrire directement dans le flux de sortie lorsqu'il est question d'obtenir un nouveau fichier).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ardennes (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 49
    Par défaut
    Merci tout le monde.
    Comme je l'ai déjà dit, ça fait 1 semaine seulement que j’apprends le java, donc je suis encore un peu perdu.
    Je n'ai pas mon code chez moi, je vais donc testez ce que vous m'avez conseillé demain matin au boulot, et je vous tiendrais au courant.
    Encore merci

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

Discussions similaires

  1. Problème dans mon code
    Par mrbou dans le forum ASP
    Réponses: 15
    Dernier message: 01/10/2008, 14h38
  2. Réponses: 3
    Dernier message: 15/03/2008, 15h15
  3. Problème dans mon code
    Par curro dans le forum Débuter
    Réponses: 14
    Dernier message: 29/08/2007, 01h46
  4. Réponses: 2
    Dernier message: 03/05/2007, 09h00
  5. Réponses: 13
    Dernier message: 17/10/2006, 15h35

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