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

Langage Java Discussion :

Formater un fichier CSV


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de _shuriken_
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2006
    Messages : 543
    Points : 454
    Points
    454
    Par défaut Formater un fichier CSV
    Bonjour,

    J'aimerai pouvoir prendre un fichier CSV, le formater en TXT comme suit (avec la position/offset, la taille et le type du champs) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    champs1 1; 24; A
    champs2 25; 6; A
    champs3 40; 31; A
    champs4 40; 71; A
    champs5 111; 24; N
    J'ai regardé un peu ce tuto http://thierry-leriche-dessirier.dev...ier-csv-5-min/; mais il ne répond pas à mon besoin.

    Avez-vous des pistes ou des bouts de code à me fournir que je pourrai adapter ?

    Cordialement,
    "When you can measure what you are speaking about, and express it in numbers, you know something about it; but when you cannot measure it, when you cannot express it in numbers, your knowledge is of a meager and unsatisfactory kind; it may be the beginning of knowledge, but you have scarcely in your thoughts advanced to the state of Science, whatever the matter may be."

    Lord Kelvin - 1883.

  2. #2
    Membre confirmé Avatar de _shuriken_
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2006
    Messages : 543
    Points : 454
    Points
    454
    Par défaut
    Bonjour,

    J'ai pu créer ce bout de 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
     
          String esp1="",esp2="",esp3="",esp4="",esp5="";
          int p=file.getRowsCount();
             for( int i=1, j=0; i<=p;i++){
               d = file.getData(i, j);
               String[] s= d.split(",");
                int l = 24-s[0].length();
                 esp1="";
                 esp2="";
                 esp3="";
                 esp4="";
                 esp5="";
     
            for( int tr=1;tr<=24-s[0].trim().length();tr++){
               esp1=esp1.concat(" ") ;
             }
            for( int tr2=1;tr2<=6-s[1].trim().length();tr2++){
               esp2=esp2.concat(" ") ;
            }
            for( int tr3=1;tr3<=40-s[2].trim().length();tr3++){
               esp3=esp3.concat(" ") ;
            }
            for( int tr4=1;tr4<=40-s[3].trim().length();tr4++){
               esp4=esp4.concat(" ") ;
            }
                for( int tr5=1;tr5<=24-s[4].trim().length();tr5++){
               esp5=esp5.concat(" ") ;
            }
     
           System.out.println("Le contenu est " + d+ " et ");
     
           fichierIns.println(s[0].concat(esp1) +""+s[1].concat(esp2)+""+s[2].concat(esp3)+""+s[3].concat(esp4)+""+s[4].concat(esp5)+"");
    Mon problème est que le contenu de certains champs (esp3 et esp4) sont parfois éparse

    Voici ce que mon fichier doit contenir comme ligne en output :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0000019                  910                                           ASSOCIATION KALIBER                     910001202622
    Voici ce que mon code me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000019                 910   910001202622                                    ASSOCIATION KALIBER
    La différence est sur la taille de l’enregistrement, qui doit être sur 135 digits au lieu de 188.

    Le formatage des champs pose toujours un soucis.
    "When you can measure what you are speaking about, and express it in numbers, you know something about it; but when you cannot measure it, when you cannot express it in numbers, your knowledge is of a meager and unsatisfactory kind; it may be the beginning of knowledge, but you have scarcely in your thoughts advanced to the state of Science, whatever the matter may be."

    Lord Kelvin - 1883.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Bonjour,

    il me semble qu'il y ait une incohérence dans le fichier en entrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    champs1 1; 24; A
    champs2 25; 6; A
    champs3 40; 31; A
    champs4 40; 71; A
    champs5 111; 24; N
    Pour moi cela devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    champs1 1; 24; A
    champs2 25; 6; A
    champs3 31; 40; A
    champs4 71; 40; A
    champs5 111; 24; N
    - Ensuite je créerais une liste de bean représentant chaque ligne du fichier en entrée.

    Code java : 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
     
    public class Row{
     
    private final String field;
     
    private final int length;
     
    private final int offset;
     
    private final String jeNeSaisPasCeQueRepresenteLeDernierChamps;
     
    public Row(final String field, final int length, final int offset, final String jeNeSaisPasCeQueRepresenteLeDernierChamps){
    //Setter tous les champs.
    }
     
    //Getters
    }

    - Je n'utiliserais pas une boucle avec un concat, mais un String.format(). Il y a plein d'exemples qui expliquent comment faire.

    Padding à droite (où la variable n représente la longueur total du champ et s représente le String):
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    String.format("%1$-" + n + "s", s);

    Et ensuite j'utiliserais un StringBuilder pour appender touts les champs.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Ce que tu veux obtenir n'est pas un fichier CSV, mais un fichier à taille fixe ou fichier plat.

    Je ne connais pas de librairie toute faite publique pour ce besoin. Mais, c'est assez simple à refaire.

    Tu peux regarder le sujet suivant :
    http://www.developpez.net/forums/d12...-fichier-plat/

    La partie du code à reprendre serai :

    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
    public class PaddingTest {
     
        public static void main(String[] args) {
            System.out.println("Left Padding: " + leftPad("abcd", 8));
            System.out.println("Right Padding: " + rightPad("abcd", 8));
        }
     
        public static String leftPad(String s, int width) {
            return String.format("%" + width + "s", s);
        }
     
        public static String rightPad(String s, int width) {
            return String.format("%-" + width + "s", s);
        }
     
    }
    Via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    champs1 1; 24; A
    champs2 25; 6; A
    champs3 40; 31; A
    champs4 40; 71; A
    champs5 111; 24; N


    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
    public class PaddingTest {
     
    	public static void main(String[] args) {
    		String[] contenuChamps = { "0000019", "910____________", "",
    				"ASSOCIATION KALIBER____________", "910001202622******" };
    		int[] tailleChamps = { 25, 6, 40, 40, 24 };
    		StringBuilder sb = new StringBuilder();
    		System.out.println("Contenu des champs :");
    		for (int i = 0; i < tailleChamps.length; i++) {
    			sb.append(rightPad(contenuChamps[i], tailleChamps[i]));
    			System.out.println(contenuChamps[i]);
    		}
     
    		System.out.println("Ligne obtenu :");
    		System.out.println(sb.toString());
    		System.out.println("Modèle donnée en comparaison : ");
    		System.out
    				.println("0000019                  910                                           ASSOCIATION KALIBER                     910001202622");
    	}
     
    	public static String leftPad(String s, int width) {
    		return String.format("%" + width + "s", s).substring(0, width);
    	}
     
    	public static String rightPad(String s, int width) {
    		return String.format("%-" + width + "s", s).substring(0, width);
    	}
     
    }
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Maintenant c'est vrai qu'il existe une librairie qui fait tout ça.

    BeanIO

    On l'utilise dans notre projet pour communiquer avec le Backend cobol.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  6. #6
    Membre régulier Avatar de gloax29
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 70
    Points
    70

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

Discussions similaires

  1. [A-03] Export vers fichier CSV (format)
    Par Pownee dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/02/2009, 18h12
  2. Réponses: 2
    Dernier message: 04/11/2008, 16h19
  3. extraction d'une table au format d'un fichier csv
    Par smutmutant2003 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/06/2007, 16h55
  4. Réponses: 4
    Dernier message: 13/12/2006, 17h10
  5. [CSV] formater un fichier csv?
    Par fmh1982 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/12/2006, 12h47

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