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 :

Convertir un fichier texte en csv


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseaux télécom
    Inscrit en
    Juin 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2013
    Messages : 37
    Par défaut Convertir un fichier texte en csv
    Bonjour,

    Je cherche a faire un travail de mis en forme d'un export comptable .txt en fichier csv, le fichier d'origine se presente de cette maniere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    4828BQ20180531                    649100     CIAE                           7131.00C                  C I A E                           O2003
    4828BQ20180531                    512350     BANQUE PAUVRE                 19182.70D                  SARL TAGG                         O2003
    Je souhaite organisé les données dans l'ordre suivant: date;journal;code;beneficiaire;credit;debit.
    ce qui ressemble a ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2018/05/31;BQ;649100;CIAE;;7131.00
    2018/05/31;BQ;512350;BANQUEPAUVRE;19182.70;
    J'ai un peu honte de demandé mais bon , je me jette a l'eau..(je précise qu'il s'agit d'un exercice d’entraînement que je m'impose et non d'un besoin concret)

    Il y a t'il une api qui facilite le traitement, dois je faire une suite de condition? est ce que je peut allé cherché un numéro de position dans une ligne de mon fichier afin d'y inclure un point virgule...bref je ne sais pas ou démarrer.

    J'arrive a ouvrir mon fichier puis en faire affiché le contenu dans la console, mais sa s’arrête là et j'ai besoin de tuyau afin de m'orienter dans ma recherche.

    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
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
     
     
     
     
     
        public class TraitementFichier {
     
            public static void main(String[] args) throws IOException {
     
                try {
     
                    File f = new File("/home/anje84/Bureau/testcsv.txt");
     
                    BufferedReader b = new BufferedReader(new FileReader(f));
     
                    String readLine = "";
     
                    System.out.println("Reading file using Buffered Reader");
     
                    while ((readLine = b.readLine()) != null) {
                        System.out.println(readLine);
                    }
     
                } catch (IOException e) {
                    e.printStackTrace();
                }
     
            }
     
        }

  2. #2
    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,

    La seule API qui va vraiment te simplifier la vie, c'est une qui peut lire ton fichier ligne par ligne.

    Je vois que tu connais déjà BufferedReader qui va faire ça pour toi. C'est parfait.

    Ensuite le problème qui se pose c'est comment séparer les différents champs de chaque ligne. À première vue c'est évident, ils sont séparés par des espaces, ou peut-être des mélanges d'espaces et tabulation. Des blancs, quoi.

    Sauf que, problème. Pour le 3e champ, on a comme exemples "CIAE" et "BANQUE PAUVRE". Le deuxième contient un espace, alors que c'est la valeur du champ. On ne peut donc pas dire "dès qu'il y a un ou plusieurs blancs, on passe au champ suivant." Parce qu'alors, sur la deuxième ligne, le 3e champ deviendrait "BANQUE" et le 4e serait "PAUVRE". Ça ne marche pas.

    On peut imaginer plusieurs solutions :

    - Les champs sont séparés par plusieurs blancs. C'est à dire qu'un espace tout seul reste un simple espace, et fait partie du champ. Mais au moins deux espaces qui se suivent, ça c'est une séparation entre les champs.

    Dans ce cas tu pourrais utiliser ligne.split("\\s{2,}") pour découper ta ligne en plusieurs champs, séparés par deux blancs ou plus.

    - Les champs 1 et 2 sont des codes sans blanc. Ils sont donc séparés dès qu'on tombe sur un blanc. Le champ 3 peut contenir des blancs à l'intérieur. Alors on sépare le champ 2 et 3 par des blancs, mais quand on tombe sur un blanc ensuite c'est pas forcément un séparateur, il peut faire partie du champ 3. Mais le champ 4 commence forcément par un nombre, et le champ 3 n'a pas le droit d'avoir un mot qui commence par un nombre. Donc si en lisant le champ 3 on tombe sur un blanc suivi d'un nombre, le nombre commence en fait le champ 4, et le blanc était le séparateur entre 3 et 4.

    Dans un cas comme celui-là, tu seras aidé par les expressions régulières et leurs groupes de capture.

    Une fois que tu as choisi une stratégie, il ne reste plus qu'à le faire :

    - lire le fichier ligne par ligne
    - pour chaque ligne, extraire les champs qui t'intéressent
    - convertir les champ de leur format de départ vers celui qui t'intéresse
    - construire la ligne que ça doit donner dans le fichier résultat
    - écrire cette ligne dans le fichier résultat
    - passer à la ligne suivante

    Citation Envoyé par anje84 Voir le message
    est ce que je peut allé cherché un numéro de position dans une ligne de mon fichier afin d'y inclure un point virgule...
    Non. On ne peut pas modifier l'intérieur d'un fichier texte. La seule chose à faire quand on a besoin de faire ça, est de réécrire le fichier entièrement, du début à la fin, en y faisant les modifications voulues en cours de route.

    Cela n'est pas tellement une question de Java mais a plutôt à voir avec la manière dont les fichiers fonctionnent en informatique.

    (Après, rien ne t'empêche de lire toutes les lignes du fichier en mémoire, de sorte de pouvoir les trouver en fonction de leurs numéros de ligne, puis ensuite de remplacer en mémoire chaque ligne par une autre où tu as ajouté des point-virgule, puis ensuite de réécrire toutes ces lignes dans un fichier. Mais ça me semble compliquer les choses pour rien.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Technicien réseaux télécom
    Inscrit en
    Juin 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2013
    Messages : 37
    Par défaut
    Re-bonjour,

    Si je veut que a chaque ligne ou il y a ça 4828BQ20180531, je puisse faire cette séparation 4828;BQ;20180531; comment je peut m'y prendre?
    Mon but c'est d'arrivé a mettre les séparateur a des endroits ou il n'y a rien qui me permet de discriminé le contenu, cette chaine d'info finalement contient un numéro d’écriture , un code de journal, ainsi que la date..

    A moins que je dois fournir un modèle du genre chaque ligne dois être réécris sous cette forme XXXX;XX;XXXX/XX/XX; ect... ?

  4. #4
    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,

    1. Pour ce qui est du découpage, il te faut à partir de la structure de ligne utiliser les méthodes adaptées de la classe String, selon les informations qu'il y a dans la ligne, comment elles sont "structurées", et ce que tu veux obtenir comme informations isolées.
      1. comment déjà dit, la méthode split() permet de découper la chaîne selon un séparateur défini par une expression régulière.
        Dans le cas de "4828BQ20180531", dont on veut obtenir "4828", "BQ", "20180531", et que "BQ" est toujours la valeur, on pourrait faire :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        String[] decoupage = string.split("BQ");
        String premierePartie = decoupage[0]; // le 4828
        String secondePartie = decoupage[1]; // le 20180531
      2. la méthode indexOf(String) te permet de connaître la position d'une chaîne dans une autre :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int positionDeBQ = string.indexOf("BQ");
      3. la méthode substring(int, int) te permet d'extraire une partie d'une chaîne :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        String premierePartie = string.substring(0, string.indexOf("BQ")); // le 4828
        String secondePartie = string.substring( string.indexOf("BQ") + "BQ".length() ); // le 20180531
      4. etc. Regarde la JavaDoc de la classe java.lang.String et prend les méthodes qui te semblent le plus adaptées à chaque étape de récupération d'une information donnée
    2. Pour générer la ligne finale, les données donc séparées par des point-virgules
      1. Soit tu procèdes par concaténation en utilisant la classe StringBuilder
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append( information1 );
        stringBuilder.append( ';' );
        stringBuilder.append( information2 );
        stringBuilder.append( ';' );
        stringBuilder.append( information3 );
        String ligneFinale = stringBuilder.toString();
        Attention, si une variation d'information est null, tu retrouveras le texte "null" dans la chaîne. Si tu veux plutôt une chaîne vide, il faut traiter le cas :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if ( information2!=null ) stringBuilder.append(information2); // si information2 est null, on ne concatène rien
      2. Tu peux mettre les différentes informations dans un tableau :
        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
        Object[] ligneDeDonnees = new Object[nombreDeColonnes];
        ligneDeDonnees[0] = numero;
        ligneDeDonnees[1] = date;
        // etc
        StringBuilder stringBuilder = new StringBuilder();
        boolean first=true;
        for(Object donnee : ligneDeDonnees) {
           if ( first ) { 
                first = false;
           }
           else {
                stringBuilder.append(';');
           }
           if ( donnee != null ) {
                stringBuilder.append( donnee );
           }
        }
        Attention, append( donnee ) utilise la méthode standard toString() pour la convertion en String, ou concatène "null" si la variable vaut null. Il faudra traiter spécifiquement les cas à part (comme par exemple pour formater la date en JJ/MM/AAAA).
      3. La classe java.util.StringJoiner fait tout ça pour toi, sauf qu'il te faut d'abord convertir les informations en String
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        String[] informationsSousFormeDeString = /* création du tableau */
        StringJoiner joiner = new StringJoiner(";"); 
        for(String information : informationsSousFormeDeString) {
        	joiner.add(information);
        }
        String ligneFinale = joiner.toString();
      4. etc
    3. En complément, il y a différentes classes qui pourront t'aider. Par exemple pour passer d'une date sous la forme "20180531" à la forme "31/05/2018", tu peux utiliser java.time.DateTimeFormatter, pour convertir la première forme en date, puis celle-ci dans la forme finale.
    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.

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour

    J'ai pris les deux lignes données et j'ai aperçu qu'il n'y a pas de séparateur mais c'est un fichier plat (flat file), donc les champs sont basés sur le nombre de caractères mais pas avec un séparateur. Tu dois donc prendre toute la ligne et utiliser un substring pour avoir chaque champ et trim pour supprimer les espaces qui complète le nombre de caractères pour chaque champ.

    A+.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Par défaut
    Bonjour,

    C'est pas plutôt des fichiers à largeur fixe ?

    Si oui tu dois connaitre la taille allouée à chaque colonne et ce que la colonne représente.

    J'ai eu des fichiers comptable à parser récemment qui fonctionnait de cette façon.

    Amuse toi bien :p

    Bien à toi,

    Namaa

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

Discussions similaires

  1. [CSV] convertir un fichier texte formaté en CSV
    Par cotede2 dans le forum Langage
    Réponses: 1
    Dernier message: 20/06/2009, 18h08
  2. Convertir un fichier texte du format csv au format hws
    Par slayer23 dans le forum MATLAB
    Réponses: 8
    Dernier message: 14/06/2007, 17h48
  3. Réponses: 13
    Dernier message: 05/07/2006, 09h39
  4. [Excel] Convertir un fichier xls en csv sous UNIX
    Par Tsuful dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/04/2006, 11h12
  5. Convertir un fichier texte ms-dos
    Par frechy dans le forum Windows
    Réponses: 8
    Dernier message: 02/03/2006, 20h59

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