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 :

Transformer des colonnes en lignes


Sujet :

avec Java

  1. #1
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut Transformer des colonnes en lignes
    Bonjour à tous,

    J'ai un fichier csv qui est comme ceci(columnName,columnValue). c'est à dire pour une colonne donnée, j'ai sa valeur à coté. Voir exemple ci-dessous :
    "AccountNumber";"12235adssqq"
    "AccountSubType__c";"bonjour"
    "ActivityIdentificationCode__c";"bonsoirs"
    "AsstEmail__pc";"kpk@gmail.com"
    ---------------------------------------
    "AccountNumber";"12236ads"
    "AccountSubType__c";"bonj"
    "ActivityIdentificationCode__c";"bonsoir"
    "AsstEmail__pc";"test@gmail.com"

    Je voudrais avoir qu'une ligne pour toutes les colonnes. Et les autres lignes seront les valeurs. Faire comme si je transposais une matrice. Voir exemple ci-dessous :
    "AccountNumber";"AccountSubType__c";"ActivityIdentificationCode__c;"AsstEmail__pc"
    "12235adssqq";"bonjour";"bonsoirs";"kpk@gmail.com"
    "12235ads";"bonj";"bonsoir";"test@gmail.com"

    merci de votre aide afin de le mettre en place.

  2. #2
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Cela dépend exactement de ce que tu as en entrée. Si tu as un fichier, ou plusieurs, que tu lis au fur et à mesure, tu peux simplement faire une transposition à la volée. Si tu as un moyen de déterminer le nombre de lignes dès le départ (le nombre de fichiers par exemple si tel est le cas), tu peux utiliser un tableau de 4 colonnes et le nombres de ligne adéquats. Sinon, utilises une List de tableau de 4 colonnes. Tu lis chaque couple nom, valeur, avec un switch sur le nom, tu affectes la valeur à la bonne colonne, et tu stockes la ligne, et tu recommences pour la ligne suivante. A la fin, tu convertis ta liste en tableau, et voilà.

    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
     
    // pour chaque groupe de valeurs
    {
    String[] valeurs = new String[4]; // un tableau pour les 4 valeurs
     
    // lire chaque ligne pour chaque valeur
    for(String ligne : lectureLignes(fichier) ) {
       String[] valeurLues = ligne.split(";");
       String columnName = valeurLues[0];
       String columnValue = valeurLues[1];
       switch( columnName ) {
       case "AccountNumber":
           valeurs[0] = columnValue;
           break;
       case "AccountSubType__c"
           valeurs[1] = columnValue;
           break;
     
       /* etc */
     
    }
     
    list.add( valeurs ); // pour l'ajouter à la liste
     
    }
    A la fin de la lecture de tous les groupes, tu peux retrouver un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[][] array = list.toArray(new String[list.size()][4]);
    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.

  3. #3
    Membre averti

    Homme Profil pro
    informatique
    Inscrit en
    Avril 2013
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 280
    Points : 406
    Points
    406
    Billets dans le blog
    1
    Par défaut
    merci pour cette reponse rapide.
    voici ce que je viens de faire
    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
     
     public static void main(String[] args) throws FileNotFoundException, IOException {
           BufferedReader in ;
           String line="";
           ArrayList<String[]> list = new ArrayList<String[]>() ; 
           String[] valeurs= new String[4];// un tableau pour les 4 valeurs
           String[][] array;
     
     
     
               in = new BufferedReader( new FileReader ("C:\\test_csv.txt"));
     
     
                   while((line=in.readLine())!=null){
                         String[] valeurLues = line.split(";");
     
     
                 for(int i=0;i<valeurLues.length;i++)
                 {
                      String columnName = valeurLues[0];
                 String columnValue = valeurLues[1];
     
                     //System.out.println(columnName+" "+columnValue);
     
     
                 switch( columnName ) {
         case "AccountNumber":
            valeurs[0] = columnValue;
           break;
       case "AccountSubType__c":
           valeurs[1] = columnValue;
           break;
     
         case "ActivityIdentificationCode__c":
           valeurs[2] = columnValue;
           break; 
     
            case "AsstEmail__pc":
           valeurs[2] = columnValue;
           break; 
     
                 }
     
                 list.add( valeurs );  
                 }
     
     
     
               }
                   System.out.println("taille"+list.size()); // pour  taille de  la liste
     
     
     
        array=list.toArray(new String[list.size()][4]);
     
     
     
     
     
       }
    mais bizarement le contenu de array et de list est vide.je sais pas pourquoi.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    1. Déjà, toujours fermer un flux quand on a fini de le lire (ou d'écrire dedans pour un flux en sortie). Idem, évidemment pour un Reader/Writer
      Avec un try-with-resource, il suffit de faire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      try( BufferedReader in = new BufferedReader(new FileReader("C:\\test_csv.txt")) ) {
       
      // lecture du flux ici
       
      }
    2. Ensuite, il faut créer un tableau de valeurs par lignes dans le fichier de sortie : toi, tu utilises toujours le même pour chaque ligne, tu vas au final te retrouver avec une liste de n fois la même ligne, la dernière traitée
    3. Le for for (int i = 0; i < valeurLues.length; i++) { n'a pas sa place ici.
      Ton format, tel que tu l'as indiqué dans ton premier message est sous la forme
      nom1; val1
      nom2;val2
      nom3;val3
      nom4;val4
      
      Donc il n'y a a pas de parcourt à faire : le split te donne 2 colonnes, la première qui sert au switch à déterminer la colonne équivalent, et la seconde, qui est affecté à l'emplacement déterminé dans le switch. Il faut le faire pour les 4 lignes de valeurs, chaque passage déterminant une colonne différente dans le tableau à 4 éléments constituant la ligne.
    4. En revanche, dans ton programme, on ne voit nulle part de traitement des groupes de valeurs. De ton code, j'en déduis que tu as un seul fichier en entrée, et de ton premier message, je désuis des lignes avec "---------------------------------------", qu'il y a un séparateur de groupes de valeurs, cette ligne-là donc.
      Il te faut donc avoir un test qui prennent en compte cette ligne de séparation. L'algorithme serait quelque chose comme ça :

      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
       
       
      String[] valeurs = null;
      while ((line = in.readLine()) != null) {
       
           if ( line.starts("-") ) {
       
               // si la ligne commence par - (alors c'est un séparateur)
               if ( valeurs!=null ) {
                    // on a une ligne en attente
                    list.add(valeurs); // on la stocke
               }
               valeurs = new String[4]; // on créé une nouvelle ligne pour lire les données suivantes
       
           }
           else {
                 String[] valeurLues = line.split(";");
       
       
      					String columnName = valeurLues[0];
      					String columnValue = valeurLues[1];
       
      					// System.out.println(columnName+" "+columnValue);
       
      					switch (columnName) {
      					case "AccountNumber":
      						valeurs[0] = columnValue;
      						break;
      					case "AccountSubType__c":
      						valeurs[1] = columnValue;
      						break;
       
      					case "ActivityIdentificationCode__c":
      						valeurs[2] = columnValue;
      						break;
       
      					case "AsstEmail__pc":
      						valeurs[3] = columnValue; // ATTENTION ICI TU AVAIS FAIT UNE ERREUR EN METTANT 2 AU LIEU DE 3
      						break;
       
      					} // fin du switch
       
       
                 } // fin du else
       
      } // fin du while
       
      // à la fin, on peut ne pas avoir de ligne de séparation, donc il faut voir si on a pas une ligne en cours
       if ( valeurs!=null ) {
                    // on a une ligne en attente
                    list.add(valeurs); // on la stocke
               } 
       
      // Ensuite, on fait la conversion en tableau
      String[][] array = list.toArray(new String[list.size()][4]);
      Restent 2 problèmes :
      1. Si on a une ligne de séparation à la fin, on va ajouter une ligne vide inutile
      2. Si on a une section incomplète (3 lignes au lieu de 4, ou 2, ou 1, ou 0), on va avoir des lignes incomplètes

      Il faudrait ajouter un test de validité de lignes (en comptant le nombre de valeurs nulles dans le tableau valeurs) et en réagissant en fonction (s'il y 0 valeurs, alors on ignore, s'il y'en a 4 on ajoute à list et sinon, en fonction de ton besoin (log d'une erreur et on ignore la ligne, ou log d'un warning et on ajoute quand même la ligne, ou log d'une erreur, on arrête immédiatement la lecture du reste du fichier...)

    5. ensuite, il est étrange en effet que tu te retrouves avec une liste vide : cela signifierait que soit tu ne lis aucune ligne dans le fichier, soit tu ne lis que des lignes vides (valeurLues est toujours de taille 0).
    6. A noter que le split(";") est une simplification : s'il y a des ; dans les valeurs, cela posera un problème. On peut traiter ça simplement si on est sûr qu'aucun nom ne peut contenir de ; (ce qui est manifestement le cas) on limitant le nombre d'applications du pattern dans le split à une fois : line.split(";",1);
    7. NB inutile de créer ses variables au début de la méthode (on n'est pas en fortran, ou en cobol, ou je ne sais quel vieux langage) : toujours créer ses variables au plus proche du besoin, et les limiter dans leur scope (ne pas pouvoir les utiliser là où elles ne servent à rien)
    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.

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

Discussions similaires

  1. [AC-97] Transformer des colonnes en lignes
    Par rogerfon dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/07/2014, 13h17
  2. transformer des colonnes en ligne
    Par noolog dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 21/02/2013, 12h19
  3. Transformer des colonnes en lignes
    Par Heisenberg59 dans le forum Débutez
    Réponses: 4
    Dernier message: 01/10/2012, 19h03
  4. Transformer des colonnes en lignes
    Par marman dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2006, 18h43
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 13h43

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