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

Documents Java Discussion :

Afficher l'heure associée à une activité depuis un csv.


Sujet :

Documents Java

  1. #61
    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
    Cela ne t'aidera pas beaucoup d'utiliser des nulls au lieu de 1, parce que la transformation de null en String va donner "null", pas "" comme tu t'y attends je pense.

    Sinon, n'oublie pas que notre map de groupement n'invente pas de clefs, donc on n'y trouve jamais que des 1. C'est le .getOrDefault(eq, 0L) qui fait que ça retourne 0L quand il n'y a pas de mapping. Un simple get() retourne justement null lorsqu'il n'y a pas de mapping. Le getOrDefault c'était justement pour ne pas avoir null. Donc il suffit d'utiliser get, et tu auras null.

    Seulement, comme je le disais, un String.valueOf de null, C'est "null".

    Rappel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .map(eq -> etime.getValue().getOrDefault(eq, 0L))
    map(String::valueOf)
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .map(eq -> etime.getValue().getO(eq))
    map(String::valueOf)
    va donner "1" ou "null".

    Pour avoir "1" ou "", il faut transformer le 1 en "1" et le null en "" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .map(eq -> etime.getValue().get(eq))
    map(v -> v==null?"":String.valueOf(v)),
    Ou encore plus simple, au lieu de générer des 1L, générer directement des "1", et faire getOrDefault(eq,"").

    Au lieu de Collectors.reducing(0L, a->1L, (a,b)->1L), Collectors.reducing("1", a->"1", (a,b)->"1") devrait fonctionner (il faudra bien sûr retyper la map en Map<LocalDate, Map<LocalTime, Map<String, String>>>
    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.

  2. #62
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ben si, en fait C3js utilise indifféremment "null" ou """".
    pourrais tu me dire comment faire en sorte que chaque équipement soit écrit dans son propre fichier csv ?

  3. #63
    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
    Citation Envoyé par gadje Voir le message
    pourrais tu me dire comment faire en sorte que chaque équipement soit écrit dans son propre fichier csv ?
    Bah, ça tu devrais être capable de le faire tout seul. Piste : pour parcourir les équipements : equipements.stream(). Il suffit d'inverser le parcours date/parcours time/parcours equiment, en parcours equipement/parcours data/parcours time, et d'intercaler la production de l'ouputstream (1 par équipement). On peut le faire en un stream, avec une petit trick qui convertit les IOException en UncheckedIOException) , mais tu peux aussi le découper 2 deux.
    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.

  4. #64
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ok, je me lance.
    Le début ressemblerait t-il à ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Map<String, Map<LocalDate, Map<LocalTime, Long>>> map = listDistinct.stream()//Je créé une Map ayant une clé de type String, ayant pour valeur une Map ayant pour clé LocalDate et valeur une Map qui a une clé LocalTime
    .collect(Collectors.groupingBy(Donnees::getEquipement,//Je groupe d'abord par équipements
    	 Collectors.groupingBy(Donnees::getDate,//puis par date
    	 Collectors.groupingBy( Donnees::getTime,//puis par heure
    	 Collectors.reducing(0L, a->1L, (a,b)->1L)//Produit un comptage de 0 ou 1 pour chaque équipement.
             ))));

  5. #65
    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
    Tu génères actuellement un fichier. Tu veux en générer plusieurs. Donc seul la génération change, n'est-ce pas ? Tous les calculs préliminaires de regroupement ne sont pas impactés par ce changement.

    Le code qui fait la génération c'est (je le copie du message du 27/03/2017, 14h07, donc sans changements éventuels faits depuis) :

    L'ouverture de l'ouputstream (du csv)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File fichierOut = new File(csv);
    			PrintStream out = new PrintStream(new FileOutputStream (fichierOut));
    La ligne d'entête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));

    Les lignes de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    					//date et heure à chaque ligne du csv
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));

    L'ouverture de l'ouputstream va peu changer, mais au lieu d'en avoir qu'une, tu vas en avoir une par équipement, et le nom du fichier va dépendre de cet équipement (pour distinguer).

    La ligne d'êntête est sous cette forme :

    • on affiche l'entête pour la date
    • on affiche l'entête pour l'heure
    • on affiche l'entête pour tous les équipements


    Et les données, on a plusieurs lignes telles que
    • on a la date
    • on a l'heure
    • on a 1 ou null ou rien (chaine vide) pour chaque équipement


    Pour avoir un fichier par équipement, il faut commencer par une boucle sur les equipements, et pour chaque équipement, ouvrir un PrintStream, et parcourir les données de cet équipement.

    Piste 1 : dans les blocs de code ci-dessus, equipements.stream() parcourt les équipements, c'est-à-dire le Set<String> equipements (il y en a 2, des parcours, un pour l'entête, un pour les données).

    Piste 2 : on peut inverser les parcours, au final on a les mêmes variables à disposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machins.stream().forEach( machin-> trucs.stream().forEach( truc-> out.println( machin + "," + truc ) )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trucs.stream().forEach( truc-> machins.stream().forEach( machin-> out.println( machin + "," + truc )
    ou si tu veux, avec des boucles, qui font exactement la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PrintStream out : new PrintStream(...)
    ...
     
    for(String machin : machins) {
       for(String truc : trucs) {
             out.println(machin + ","+truc);
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PrintStream out : new PrintStream(...)
    ...
     
    for(String truc: trucs) {
       for(String machin : machins) {
             out.println(machin + ","+truc);
       }
    }
    Et si maintenant tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(String truc:trucs) {
     
       try(PrintStream out : new PrintStream(... + truc)) {
           for(String machin : machins) {
             out.println( machin );
           }
       }
     
    }
    Tu vois où j'en veux en venir ?

    Essaye déjà sur la ligne d'entêtes...
    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. #66
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ok je viens de regarder comment fonctionnent les boucles foreach, elles vont me permettre de parcourir mes collections.
    Donc une 1ere boucle "foreach" pour la création de mes fichiers, 2eme boucle pour la récupération des données de chaque équipement correspondant à chaque fichier respectifs.
    Est-ce bien cela ?

  7. #67
    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
    Oui. Première boucle sur la liste d'équipements, un fichier par équipement, puis une boucle pour chaque equipement, en effet. En boucle ou en stream, dont tu as déjà exactement les structures adéquates.
    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.

  8. #68
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je parviens en mode console à afficher l'entête de chaque équipement précédée de celle de la date avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (String donneesEquip : equipements){
    						System.out.print("date,");
    						System.out.println(donneesEquip);
    						}
    Ce qui me donne ça :
    date,Extinction_Eclairage_Chambre_Applique
    date,Extinction_Eclairage_Chambre_Centre
    date,Extinction_Eclairage_Entree_Centre
    date,Extinction_Eclairage_Exterieur
    Par contre, je ne vois pas où faire mon autre boucle pour pouvoir générer mes fichiers.
    J'ai fais quelques tests en mode console pour voir comment se comportent les boucles foreach, tels que celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (String listeEquip : listDistinct){
    	for (Donnees donneesEquip : equipements){
    	System.out.print("date,");
    	System.out.println(donneesEquip + "," + listeEquip);
    	}
    }
    et ce que me retourne listeEquip, doit correspondre à l'@ des données mais pas les données elles même.
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Applique,miseEnFormeDonneesCSV.Donnees@7e0b92
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Centre,miseEnFormeDonneesCSV.Donnees@7e0b92
    date,Allumages_&_extinctions_Eclairage_Variation_Salon_Centre,miseEnFormeDonneesCSV.Donnees@7e0b92
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Applique,miseEnFormeDonneesCSV.Donnees@13ea923
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Centre,miseEnFormeDonneesCSV.Donnees@13ea923
    date,Allumages_&_extinctions_Eclairage_Variation_Salon_Centre,miseEnFormeDonneesCSV.Donnees@13ea923
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Applique,miseEnFormeDonneesCSV.Donnees@2d6539
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Centre,miseEnFormeDonneesCSV.Donnees@2d6539
    date,Allumages_&_extinctions_Eclairage_Variation_Salon_Centre,miseEnFormeDonneesCSV.Donnees@2d6539
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Applique,miseEnFormeDonneesCSV.Donnees@1ed5e3c
    date,Allumages_&_extinctions_Eclairage_Variation_Chambre_Centre,miseEnFormeDonneesCSV.Donnees@1ed5e3c
    date,Allumages_&_extinctions_Eclairage_Variation_Salon_Centre,miseEnFormeDonneesCSV.Donnees@1ed5e3c
    Là, je sèche, désolé.
    Je ne vois pas sur quelle collection boucler ni où faire ces boucles.

  9. #69
    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
    Reprenons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));
    ça génère la liste des equipements, et ça générèe l'entête : la liste des equipements séparés par une virgule.
    avant il y a out.print("date,"); ça affiche l'entête de la colonne date (en réalité la date et l'heure).

    Donc pour générer la liste des équipements, ce qu'on fait déjà, on a rien à refaire, rien à changer !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    Ensuite pour boucler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(String eq : equipements) {
       ...
    }
    ou par stream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    equipements.stream.forEach( eq-> ... );
    Créer un PrintStream pour écrire dedans. Ça aussi, c'est déjà fait. Y'a que le nom du fichier qui change.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat + ".csv";
    			File fichierOut = new File(csv);
    			PrintStream out = new PrintStream(new FileOutputStream (fichierOut));
    on intègre le nom de l'équipement maintenant (et j'en profite pour mettre le try-with-resource, qu'il me semblait t'avoir déjà conseillé dès le début) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
    File fichierOut = new File(csv);
    try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
               ...
     
    }
    Dans une boucle donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(String eq : equipements) {
        String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
        File fichierOut = new File(csv);
        try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
               ...
     
       }
    }
    Rien de compliqué jusque là, quand même ?

    Dans un stream, c'est un chouïa plus compliqué, à cause de l'IOException :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    equipements.stream.forEach( eq-> {
        String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
        File fichierOut = new File(csv);
        try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
               ...
     
       }
       catch(IOException e) {
              throw new UncheckedIOException(e); // une uncheck exception
       }
    });
    Evidemment dans le code avec boucle, il faudra un catch ou un throws quelque part, de toute manière.

    Et maintenant, on doit rajouter l'entête, pour chaque fichier, donc date, suivi du nom de la colonne pour la valeur, je ne sais pas value par exemple, ou le nom de l'équipement (eq) ou ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(String eq : equipements) {
        String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
        File fichierOut = new File(csv);
        try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
                out.println("date,value");
     
       }
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    equipements.stream().forEach( eq-> {
        String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
        File fichierOut = new File(csv);
        try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
              out.println("date,value");
     
       }
       catch(IOException e) {
              throw new UncheckedIOException(e); // une uncheck exception
       }
    });
    Cela ne me semble quand même pas si complexe que ça d'arriver là.

    Et donc les lignes de données, par stream (le code qui existait déjà, j'ai juste viré le code commenté pour qu'on y voir plus cliar, et ajusté l'autre commentaire pour qu'il soit en rapport avec ce qu'il comment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                                                               .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // date + time,
    			                                   .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													.map(String::valueOf)
    							                                                .collect(Collectors.joining(",")))));
    soit

    • map.entrySet().stream().sorted(Map.Entry.comparingByKey()) .
      on parcourt les entries de la map (des associations clef-valeur), et on tri selon les clefs (les clefs étant des dates, on trie par date)
    • .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()).
      pour chaque entrée edate, on en prend la valeur, une map, et on parcourt les entries de cette map
    • .peek(etime-> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " +etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // date + time,.

      Pour chaque entrée etime, on en prend la clef qu'on formate "HH:mm:ss", et la clef de l'entrée d'avant (qu'on a toujours, puisqu'on est dans un sous parcourt, comme si c'était une boucle imbriquée quoi) qu'on format "yyyy-MM-dd", et on concatène les deux avec une espace entre, et on balance le résulat dans le out. Jusque là pas de changement.

    • .forEach(etime-> out.println(equipements.stream().

      puis on continue le parcours des entries time/(map equipement/valeur).
      Là, on voit equipements.stream() : un parcours des equipement. Donc, là, le code doit changer, puisque le parcours, on a décidé de le sortir et de le faire avant. Donc on a un eq sous la main, qui contient le nom de l'équipement.
      Si on faisait .forEach(etime-> out.println(eq)))); en virant les trois lignes d'après (on n'en a plus besoin), on aurait dans le csv, sur chaque ligne, la date et l'heure, virgule, le nom de l'équipement.
      A la place du nom de l'équipement, on veut la valeur correspondant dans la map time/map, soit etime.getValue().get(eq).

      Le reste après y'en a plus besoin, puisque c'était pour générer les valeurs du tableau croisié time/equipement, qu'on veut plus.
    • .map(eq -> etime.getValue().getOrDefault(eq, 0L))
    • .map(String::valueOf)
    • .collect(Collectors.joining(",")))));
    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.

  10. #70
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Mon code ressemble à ça maintenant :
    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
     
    package miseEnFormeDonneesCSV;
     
    	import java.io.File;
    	import java.io.FileNotFoundException;
    	import java.io.FileOutputStream;
    	import java.io.FileReader;
    	import java.io.IOException;
    	import java.io.PrintStream;
    	import java.time.LocalDate;
    	import java.time.LocalTime;
    	import java.time.format.DateTimeFormatter;
    	import java.util.*;
    	import java.util.stream.Collectors;
    	import com.opencsv.*;
     
    	public class EntreeTraitement {
     
    		public static String type;
    		public static int cpt;
     
    		public static void main(String[] args) throws FileNotFoundException, IOException{	
    			for (int i = 0; i < 19; i++){						
    			if (cpt == 0){type = "eclairages_ferme";}			
    			if (cpt == 1){type = "eclairages_ouvert";}			
    			if (cpt == 2){type = "volets_ouvert";}			
    			if (cpt == 3){type = "volets_ferme";}
    			if (cpt == 4){type = "portes_ouvert";}			
    			if (cpt == 5){type = "portes_ferme";}			
    			/*if (cpt == 6){type = "plan_ouvert";}
    			if (cpt == 7){type = "plan_ferme";}*/
    			if (cpt == 6){type = "compteurs_actions";}
    			if (cpt == 7){type = "capteurs_actions";}
    			/*if (cpt == 10){type = "fenetres_ouvert";}
    			if (cpt == 11){type = "fenetres_ferme";}*/
    			if (cpt == 8){type = "variateurs_ouvert";}
    			if (cpt == 9){type = "variateurs_ferme";}
    			if (cpt == 10){type = "eclairages_actions";}
    			if (cpt == 11){type = "volets_actions";}
    			if (cpt == 12){type = "portes_actions";}
    			if (cpt == 13){type = "fenetres_actions";}
    			if (cpt == 14){type = "variateurs_actions";}
     
    			String inputFile = type;//Variable inputFile de type String ayant pour valeur : "eclairages_ferme", "eclairages_ouvert"...
    			String[] creaRep = inputFile.toString().split("_");//Variable creaRep de type tableau de String dans lequel je stock caque mot de type séparés par "_"
    			String repGroupe = creaRep[0];//Variable repGroupe de type String dans laquelle je mets chaque mot du tableau ayant pour index 0, (le 1er mot de type)
    			String fichierIn = "/home/pi/KNX/logs/csv/" + type + ".csv";//Variable fichierIn de type String contenant le chemin du fichier csv source
    			File fichierCSV = new File(fichierIn);//Création objet fichierCSV de type File dans le quel je mets fichierIn
    			cpt++;			
    			String etat = creaRep[1];//Variable etat de type String dans laquelle je mets chaque mot ayant pour index 1, (le 2eme mot de type)
    			String csv = "/home/pi/KNX/logs/data/" + repGroupe + "/" + etat + ".csv";			
     
    			File fichierOut = new File(csv);
    			PrintStream out = new PrintStream(new FileOutputStream (fichierOut)); 
     
     
    			List<String[]> myEntries;
    			try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {
    				myEntries = reader.readAll(); //Le contenu du fichier lu est passé dans myEntries					
     
    				List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    				    .skip(1)
    					.map(Donnees::new) // qu'on converti en Stream<Donnee>
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipement et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // on transforme le stream résultant en liste (de données) (List<Donnees>)
     
    					Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream 
    						.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                    Collectors.groupingBy( Donnees::getTime, // puis par heure
                                    Collectors.groupingBy(Donnees::getEquipement,
                                    Collectors.reducing(0L, a->1L, (a,b)->1L)
                                    )))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>					
     
    					out.print("date,");
     
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
     
     
     
    					out.println(equipements.stream().collect(Collectors.joining(",")));		
     
     
     
     
    					//Code permettant la récupération de le date et des données à chaque ligne du csv
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													/*pour avoir "null" au lieu des "0"
    													.map(eq -> etime.getValue().get(eq))*/
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Hors dans ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for(String eq : equipements) {
        String csv = "/home/pi/KNX/logs/data/" + repGroupe + "/" + etat +"_" + eq + ".csv";
        File fichierOut = new File(csv);
        try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
     
                out.println("date,value");
     
       }
    }
    "equipements" est appelé alors qu'il n'est pas encore créé, c'est ça que je ne comprends pas.

  11. #71
    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
    Citation Envoyé par gadje Voir le message
    "equipements" est appelé alors qu'il n'est pas encore créé, c'est ça que je ne comprends pas.

    Citation Envoyé par joel.drigo Voir le message
    Ensuite pour boucler :
    Alors, c'est vrai que c'est un peu subtil, mais "ensuite" ici, ça veut dire après, sous entendu après ce dont je viens de parler, c'est-à-dire

    Citation Envoyé par joel.drigo Voir le message

    Donc pour générer la liste des équipements, ce qu'on fait déjà, on a rien à refaire, rien à changer !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));
    Alors oui, le code que tu fais pour créer ton out, il faut le supprimer, parce que c'est effectivement fait bien trop tôt. Mais tout ce dont je parle, boucler sur les équipements, et le reste, ça remplace bien sûr tout le traitement qui est fait après la ligne ci-dessus, tout comme c'était déjà le cas avant (à part la création du PrintStream, qui de toute manière, était déjà faite bien trop tôt en réalité, mais ce n'était pas gênant pour la logique du programme toujours créer ses variables au plus près de là où on en a besoin).
    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.

  12. #72
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    En gros je dois restructurer mon code en déplaçant ce bout de code qui me permet de créer mes fichiers, (tout en faisant une boucle foreach dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (String equipe1 : equipements){
    String etat = creaRep[1];//Variable etat de type String dans laquelle je mets chaque mot ayant pour index 1, (le 2eme mot de type)
    String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + equipe1 + etat + ".csv";			
    File fichierOut = new File(csv);
    PrintStream out = new PrintStream(new FileOutputStream (fichierOut));}
    juste au-dessus du bout de code qui me permet de créer l'entête et de celui qui permet de mettre en forme les données qui seront inscrites dans les csv créés :
    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
     
    out.print("date,");					
    Set<String> equipements = map.entrySet().stream()
    .flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    .collect(Collectors.toCollection(TreeSet::new));			
     
    //out.println(equipements.stream().collect(Collectors.joining(",")));//Cette ligne serait remplacer par une boucle foreach
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    .forEach(etime-> out.println(equipements.stream()
    .map(eq -> etime.getValue().getOrDefault(eq, 0L))
    /*pour avoir "null" au lieu des "0"
    .map(eq -> etime.getValue().get(eq))*/
    .map(String::valueOf)
    .collect(Collectors.joining(",")))));
    puis, à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /out.println(equipements.stream().collect(Collectors.joining(",")));
    il faudrait une boucle dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (String equipe2 : equipements){/out.println(equipe.stream().collect(Collectors.joining(",")));}
    Ce qui donnerait quelque chise 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
    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
     
    package miseEnFormeDonneesCSV;
     
    	import java.io.File;
    	import java.io.FileNotFoundException;
    	import java.io.FileOutputStream;
    	import java.io.FileReader;
    	import java.io.IOException;
    	import java.io.PrintStream;
    	import java.time.LocalDate;
    	import java.time.LocalTime;
    	import java.time.format.DateTimeFormatter;
    	import java.util.*;
    	import java.util.stream.Collectors;
    	import com.opencsv.*;
     
    	public class EntreeTraitement {
     
    		public static String type;
    		public static int cpt;
     
    		public static void main(String[] args) throws FileNotFoundException, IOException{	
    			for (int i = 0; i < 19; i++){						
    			if (cpt == 0){type = "eclairages_ferme";}			
    			if (cpt == 1){type = "eclairages_ouvert";}			
    			if (cpt == 2){type = "volets_ouvert";}			
    			if (cpt == 3){type = "volets_ferme";}
    			if (cpt == 4){type = "portes_ouvert";}			
    			if (cpt == 5){type = "portes_ferme";}			
    			/*if (cpt == 6){type = "plan_ouvert";}
    			if (cpt == 7){type = "plan_ferme";}*/
    			if (cpt == 6){type = "compteurs_actions";}
    			if (cpt == 7){type = "capteurs_actions";}
    			/*if (cpt == 10){type = "fenetres_ouvert";}
    			if (cpt == 11){type = "fenetres_ferme";}*/
    			if (cpt == 8){type = "variateurs_ouvert";}
    			if (cpt == 9){type = "variateurs_ferme";}
    			if (cpt == 10){type = "eclairages_actions";}
    			if (cpt == 11){type = "volets_actions";}
    			if (cpt == 12){type = "portes_actions";}
    			if (cpt == 13){type = "fenetres_actions";}
    			if (cpt == 14){type = "variateurs_actions";}
    			cpt++;	
     
    			String inputFile = type;//Variable inputFile de type String ayant pour valeur : "eclairages_ferme", "eclairages_ouvert"...
    			String[] creaRep = inputFile.toString().split("_");//Variable creaRep de type tableau de String dans lequel je stock caque mot de type séparés par "_"
    			String repGroupe = creaRep[0];//Variable repGroupe de type String dans laquelle je mets chaque mot du tableau ayant pour index 0, (le 1er mot de type)
    			String fichierIn = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type + ".csv";//Variable fichierIn de type String contenant le chemin du fichier csv source
    			File fichierCSV = new File(fichierIn);//Création objet fichierCSV de type File dans le quel je mets fichierIn
    			List<String[]> myEntries;
    			try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {
    				myEntries = reader.readAll(); //Le contenu du fichier lu est passé dans myEntries					
    				List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    				    .skip(1)
    					.map(Donnees::new) // qu'on converti en Stream<Donnee>
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipement et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // on transforme le stream résultant en liste (de données) (List<Donnees>)
    					Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream 
    						.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                    Collectors.groupingBy( Donnees::getTime, // puis par heure
                                    Collectors.groupingBy(Donnees::getEquipement,
                                    Collectors.reducing(0L, a->1L, (a,b)->1L)
                                    )))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>	
    					for (String equipe1 : equipements){
    					String etat = creaRep[1];//Variable etat de type String dans laquelle je mets chaque mot ayant pour index 1, (le 2eme mot de type)
    					String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + equipe1 + etat + ".csv";					
    					File fichierOut = new File(csv);
    					PrintStream out = new PrintStream(new FileOutputStream (fichierOut));
    					out.print("date,");					
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));				
    					for (String equipe2 : equipements){
    					out.println(equipe2.stream().collect(Collectors.joining(",")));		
    					}
    					//Code permettant la récupération de le date et des données pour chaque ligne du csv
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					 //.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(equipements.stream()
    													.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													/*pour avoir "null" au lieu des "0"
    													.map(eq -> etime.getValue().get(eq))*/
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));
     
    			out.close();
    			}
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Cependant "equipement" est encore appelé avant sa création et je suis obligé de mettre ma 1ere boucle là où je l'ai mise par rapport au "out",
    de plus je dois avoir u n pb de type pour ma 2eme boucle, en rapport avec le equipe2.stream.
    Est ce bien cela ?

  13. #73
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Après avoir relu tes précédents post, j'ai tenté demodifier mon code comme suit pour récupérer les valeurs associées aux bons équipements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    .forEach(etime-> out.println(etime.getValue().get(equipements))));
    													/*.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													pour avoir "null" au lieu des "0"
    													.map(eq -> etime.getValue().get(eq))
    													.map(String::valueOf)
    							                        .collect(Collectors.joining(",")))));*/
    je ne peux pas utiliser "eq" j'ai donc utilisé "equipements" qui me retourne systématiquement null, j'imagine que c'est normal. Je ne comprends pas comment faire appel à "eq" alors qu'il n'y est fait référence que dans les lignes suivantes, qui peuvent être effacées.

  14. #74
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ca y est ça fonctionne.
    Je suis un crétin.
    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
     
    List<String[]> myEntries;
    			try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {
    				myEntries = reader.readAll(); //Le contenu du fichier lu est passé dans myEntries					
     
    				List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    				    .skip(1)
    					.map(Donnees::new) // qu'on converti en Stream<Donnee>
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donct les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    		            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipement et valeur liste de donnees
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    		            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    		            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    				    .collect(Collectors.toList()); // on transforme le stream résultant en liste (de données) (List<Donnees>)
     
    					Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream 
    						.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                    Collectors.groupingBy( Donnees::getTime, // puis par heure
                                    Collectors.groupingBy(Donnees::getEquipement,
                                    Collectors.reducing(0L, a->1L, (a,b)->1L)
                                    )))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>					
     
     
     
    					Set<String> equipements = map.entrySet().stream()
    							.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    				            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    								.collect(Collectors.toCollection(TreeSet::new));	
     
    					for (String equipe1 : equipements){
    						String etat = creaRep[1];//Variable etat de type String dans laquelle je mets chaque mot ayant pour index 1, (le 2eme mot de type)
    						String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + repGroupe + "/" + equipe1 + "_" + etat + ".csv";					
    						File fichierOut = new File(csv);
    						PrintStream out = new PrintStream(new FileOutputStream (fichierOut)); 
     
    						out.println("date," + equipe1);				
     
    					//out.println(equipements.stream().collect(Collectors.joining(",")));	
     
    					//Code permettant la récupération de le date et des données pour chaque ligne du csv
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    			                  .forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    			                          .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    			                                        .forEach(etime-> out.println(etime.getValue().get(equipe1)			                                        		
    													//.map(eq -> etime.getValue().getOrDefault(eq, 0L))
    													/*pour avoir "null" au lieu des "0"
    													.map(eq -> etime.getValue().get(eq))*/
    													//.map(String::valueOf)
    							                        /*.collect(Collectors.joining(","))*/)));
     
    			out.close();

  15. #75
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    j'ai encore une petite question.
    je cherche à modifier mon code en évitant au maximum les conditions en passant par une boucle foreach telle que celle-ci :
    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
     
    String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
    		int i = 0;
    		for (String nEquipe : nomEquip){			
    			file = "file" + i;
    			fis = "fis"+ i;
    			out = "out" + i;
    			File file = new File(outputFileCSV + nEquipe + ".csv");  
    			FileOutputStream fis = new FileOutputStream(file);  
    			PrintStream out = new PrintStream(fis);
    		        ParserFichier klogParser = new ParserFichier();
    			PrintStream[] outs = {out};
    			klogParser.parse(inputFile, frLang, outs);
    			PrintStream o = new PrintStream(out);
    			MiseFormeCSV();
    			i++;
    			}
    A la place de :
    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
     
    					File file0 = new File(outputFileCSV + "eclairages_ferme" + ".csv");  
    					FileOutputStream fis0 = new FileOutputStream(file0);  
    					PrintStream out0 = new PrintStream(fis0);  					
    					File file1 = new File(outputFileCSV + "eclairages_ouvert" + ".csv");  
    					FileOutputStream fis1 = new FileOutputStream(file1);  
    					PrintStream out1 = new PrintStream(fis1);  
    					File file2 = new File(outputFileCSV + "variateurs_ferme" + ".csv");  
    					FileOutputStream fis2 = new FileOutputStream(file2);  
    					PrintStream out2 = new PrintStream(fis2);					
    					File file3 = new File(outputFileCSV + "variateurs_ouvert" + ".csv");  
    					FileOutputStream fis3 = new FileOutputStream(file3);  
    					PrintStream out3 = new PrintStream(fis3);
    					File file4 = new File(outputFileCSV + "volets_ouvert" + ".csv");  
    					FileOutputStream fis4 = new FileOutputStream(file4);  
    					PrintStream out4 = new PrintStream(fis4);					
    					File file5 = new File(outputFileCSV + "volets_ferme" + ".csv");  
    					FileOutputStream fis5 = new FileOutputStream(file5);  
    					PrintStream out5 = new PrintStream(fis5);
    					File file6 = new File(outputFileCSV + "portes_ferme" + ".csv");  
    					FileOutputStream fis6 = new FileOutputStream(file6);  
    					PrintStream out6 = new PrintStream(fis6);					
    					File file7 = new File(outputFileCSV + "portes_ouvert" + ".csv");  
    					FileOutputStream fis7 = new FileOutputStream(file7);  
    					PrintStream out7 = new PrintStream(fis7);					
    					File file8 = new File(outputFileCSV + "fenetres_actions" + ".csv");  
    					FileOutputStream fis8 = new FileOutputStream(file8);  
    					PrintStream out8 = new PrintStream(fis8);
    Mon problème se situe au niveau des typages de mon PrintStream. Mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.print(outs);
    me retourne les @ et non les données que je souhaite (de type String), comme ceci :
    [Ljava.io.PrintStream;@14ae5a5
    [Ljava.io.PrintStream;@131245a
    [Ljava.io.PrintStream;@16f6e28
    [Ljava.io.PrintStream;@15fbaa4
    [Ljava.io.PrintStream;@1ee12a4
    [Ljava.io.PrintStream;@10bedb4
    [Ljava.io.PrintStream;@103dbd3
    [Ljava.io.PrintStream;@167cf4d
    [Ljava.io.PrintStream;@a987ac
    Si je fais ç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
     
    String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
    		int i = 0;
    		for (String nEquipe : nomEquip){
     
    			file = "file" + i;
    			fis = "fis"+ i;
    			out = "out" + i;
    			System.out.println(file);
    			File file = new File(outputFileCSV + nEquipe + ".csv"); 
    			System.out.println(fis);
    			FileOutputStream fis = new FileOutputStream(file);  
    			System.out.println(out);
    			PrintStream out = new PrintStream(fis);
    					ParserFichier klogParser = new ParserFichier();
    					klogParser.filter = false;					
    					PrintStream[] outs = {out};
    					MiseFormeCSV();
    					i++;
    					}
    Je récupère bien les bonnes valeurs de type String :
    file0
    fis0
    out0
    file1
    fis1
    out1
    file2
    fis2
    out2
    ...
    J'ai tenté un transtypage mais je ne dois m'y prendre comme il faut.
    Comment puis je m'y prendre pour faire en sorte que mon PrintStream récupère les bonnes valeurs ?
    Merci d'avance.

  16. #76
    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
    La classe PrintStream permet d'écrire dans un OutputStream (un flux en sortie, un flux où l'on écrit) des chaines de caractères. Par exemple, System.out est un PrintStream. Cela n'a aucun intérêt de faire System.out.println(System.out); !
    Qu'est-ce que peut bien vouloir dire la phrase suivante :
    Citation Envoyé par gadje Voir le message
    Comment puis je m'y prendre pour faire en sorte que mon PrintStream récupère les bonnes valeurs ?
    On écrit dans un flux avec une instance de PrintStream : [c]out.println( 2 );[c], out.println("coucou");... quel sens peut bien avoir "récupérer" par rapport à un PrintStream.


    Citation Envoyé par gadje Voir le message
    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
     
    String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
    		int i = 0;
    		for (String nEquipe : nomEquip){			
    			file = "file" + i;
    			fis = "fis"+ i;
    			out = "out" + i;
    			File file = new File(outputFileCSV + nEquipe + ".csv");  
    			FileOutputStream fis = new FileOutputStream(file);  
    			PrintStream out = new PrintStream(fis);
    		        ParserFichier klogParser = new ParserFichier();
    			PrintStream[] outs = {out};
    			klogParser.parse(inputFile, frLang, outs);
    			PrintStream o = new PrintStream(out);
    			MiseFormeCSV();
    			i++;
    			}
    Il y'a 2 variables fis, dont un FileOutputStream et un String à priori, en attribut, ou alors ça ne compile pas.... enfin, utiliser 2 variables de même noms, c'est un très bon moyen de rendre le code confus ou incompilable. Surtout que fis en général c'est une abréviation pour FileInputStream... histoire d'en rajouter à la confusion.
    Et à quoi sert un PrintStream pour écrire dans un PrintStream (o) ? Et cette variable n'est même pas utilisée...
    Et en plus, il manque la fermeture du FileInputStream...

    Citation Envoyé par gadje Voir le message

    Mon problème se situe au niveau des typages de mon PrintStream. Mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.print(outs);
    me retourne les @ et non les données que je souhaite (de type String), comme ceci :
    "typage du PrintStream" n'a aucun sens. Un PrintStream est un PrintStream. Et c'est un type. Le type d'un type (métatype), ça peut servir dans d'autres contextes, mais pour coder une écriture de données dans un fichier, à rien.
    Et System.out.print(outs) affiche un tableau de PrintStream. Tu n'afficheras jamais aucune de tes données en affichant un tableau de PrintStream. Je ne sais pas où sont les données en question, mais si tu veux les afficher, et bien, c'est elles qu'il faut afficher. Et si l'idée est d'afficher ce qui a été envoyé au PrintStream, oublie. Dans un stream, un flux donc, les données ne restent jamais très longtemps, voire n'y restent pas, et toute manière, comme ça n'a aucun sens de pouvoir le faire, on y a pas accès directement : c'est juste un médium pour envoyer des choses (octets, String, int, tout dépend du type de OutputStream) vers autre chose. Par exemple un FileOutputStream est un medium pour ecrire dans un fichier. Les données passent par le FileOutputStream mais n'y restent pas, elles vont dans le fichier, c'est le but. Et si on veut afficher les données qui sont dans le fichier, et bien, il faut fermer le FileOutputStream puis relire le fichier. Si l'idée est de tracer ou loguer ce que tu écris dans le PrintStream, alors fait-le au moment d'écrire la donnée : si tu peux envoyer une donnée au PrintStream(FileOutputStream), alors tu aussi l'envoyer à System.out, ou vers ton log.


    Citation Envoyé par gadje Voir le message
    Si je fais ç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
     
    String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
    		int i = 0;
    		for (String nEquipe : nomEquip){
     
    			file = "file" + i;
    			fis = "fis"+ i;
    			out = "out" + i;
    			System.out.println(file);
    			File file = new File(outputFileCSV + nEquipe + ".csv"); 
    			System.out.println(fis);
    			FileOutputStream fis = new FileOutputStream(file);  
    			System.out.println(out);
    			PrintStream out = new PrintStream(fis);
    					ParserFichier klogParser = new ParserFichier();
    					klogParser.filter = false;					
    					PrintStream[] outs = {out};
    					MiseFormeCSV();
    					i++;
    					}
    Je récupère bien les bonnes valeurs de type String :
    Tout ce que je peux voir c'est que tu affiches en console "file0", "fis0" et "out0", "file1", "fis1", "out1"... jusqu'à "out8". Et oui, ce que fait c'est boucle : construire des chaines et les afficher, avec d'autres trucs, comme ouvrir des flux sans les fermer et de créer des instances de classe dont je ne peux deviner le code ou appeler une méthode dont je ne peux deviner le code.


    Citation Envoyé par gadje Voir le message
    J'ai tenté un transtypage mais je ne dois m'y prendre comme il faut.
    Un transtypage ? Un cast, c'est ça ? Un cast de quoi en quoi ? Genre de PrintStream en String ? Ce serait parfaitement absurde. Déjà un cast ne fait pas de conversion, juste une adaptation, d'un type vers un autre type forcément "compatible", soit vers un type plus spécifique (qui étend le premier), soit vers un type plus générique (qui est parent du premier), mais si ça ne sert à rien en fait de la faire. Un String et un PrintStream n'ont strictement aucun rapport l'un avec l'autre.
    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.

  17. #77
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    En fait il faudrait qu'à chaque tour de boucle, les noms des PrintStream "file", "fis" et "out" soient concaténés avec une valeur commençant à 0 et s'incrémentant de 1 à chaque tour de boucle.
    "file0", "fis0", "out0","file1", "fis1", "out1","file2", "fis2", "out2",....,"file8", "fis8", "out8".
    Ceci afin d'éviter d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    File file0 = new File(outputFileCSV + "eclairages_ferme" + ".csv");  
    					FileOutputStream fis0 = new FileOutputStream(file0);  
    					PrintStream out0 = new PrintStream(fis0);  	
     
    					File file1 = new File(outputFileCSV + "eclairages_ouvert" + ".csv");  
    					FileOutputStream fis1 = new FileOutputStream(file1);  
    					PrintStream out1 = new PrintStream(fis1);  
    ...
    					File file8 = new File(outputFileCSV + "fenetres_actions" + ".csv");  
    					FileOutputStream fis8 = new FileOutputStream(file8);  
    					PrintStream out8 = new PrintStream(fis8);
    J'utilise juste le mode console pour faire mes tests.

  18. #78
    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
    C'est quoi le nom des PrintStream ? Tu parles du nom des variables de type PrintStream ? Déjà, on ne peut pas créer dynamiquement des noms de variables, et en plus ça ne sert strictement à rien.
    Soit les variables sont locales au bloc, et n'importe quel nom suffit, tant qu'on peut distinguer les variables entre elles et qu'on sait le nom qu'il faut pour accèder à telle ou telle info, on s'en balance qu'à la première itération il s'appelle trucmachin0 ou trucmachin888. Son nom ne sert à y accèder dans le code de toute manière, et n'existe pas en exécution, alors de là à l'afficher...
    Et si on a besoin en dehors du bloc, on utilisera un tableau, ou une collection, un map, ou n'importe quoi d'autre qui permet un accès indexé à des instances...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int a0 = 0;
    int b0 = 1;
    int c0 = a0+b0;
    int a1=1;
    int b1=2;
    int c1 = a1+b1;
    Là on a besoin de noms différents pour distinguer a0 de a1, b0 de b1, c0 de c1 !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<=1; i++) {
          int a = i;
          int b = i+1;
          int c = a+b;
    }
    Là, on s'en fout de distingue le a quand i=0 et quand i=1 : a n'existe que dans le bloc du for, et c'est a, et lorsque i vaut 0, c'est a pour i qui vaut 0, et le coup d'après quand i=1, on a un autre a (et on peut plus accèder à l'autre de i=0, il n'existe plus, et donc il n'y a pas de distinction à faire).

    Et avec tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int[] c = new int[2];
    for(int i=0; i<=1; i++) {
          int a = i;
          int b = i+1;
          c[i] = a+b;
    }
    On s'en fout également.

    Ce qui n'enpêche pas par ailleurs de faire des traces comme on veut, avec référence sur index si ça nous chante (pas besoin d'utiliser des noms de variables pour ça)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(int i=0; i<=1; i++) {     
          int a = i;
          System.out.println("a"+i+"="+a);
          int b = i+1;
          System.out.println("b"+i+"="+b);
          int c = a+b;
          System.out.println("c"+i+"="+c);
    }
    ou, dans le cas avec tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<c.length; i++) {
          System.out.println("c"+i+"="+c[i]);
    }
    mais je pourrais aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<c.length; i++) {
          System.out.println("c["+i+"]="+c[i]);
    }
    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.

  19. #79
    Nouveau membre du Club Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    J'ai trouvé une autre solution en faisant :
    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
     
    package miseEnFormeDonneesCSV;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.time.LocalDate;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeSet;
    import java.util.stream.Collectors;
     
    import com.opencsv.CSVReader;
     
    public class Convertisseur_CSV {
     
    	public static String type;
    	public static String file;
    	public static String fis2;
    	public static final int nbEquip = 9;
     
    	public static <printStream> void main(String[] args) throws IOException  {
    		String inputFile = "C:/wamp/www/Klog/Klog/capt.klog";
    		String outputFileCSV = 	"C:/wamp/www/Klog/Temp/";
    		boolean frLang = true;	// si les logs bruts ont ete enregistres avec la langue francaise... (false = us)
     
    		// Ecriture fichiers CSV pour chaque groupe d'équipements.
    		String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
    		int i = 0;
    		File[] files = new File[nbEquip];
    		FileOutputStream[] fis = new FileOutputStream[nbEquip];
    		PrintStream[] outs = new PrintStream[nbEquip];		
    		for (String nEquipe : nomEquip){
    			files[i] = new File(outputFileCSV + nEquipe + ".csv"); 
    			fis[i] = new FileOutputStream(files[i]);  
    			outs[i] = new PrintStream(fis[i]);		
    			i++;
    		}
    		ParserFichier klogParser = new ParserFichier();
    		klogParser.parse(inputFile, frLang, outs);
    		String[] equip = {"eclairages_ferme","eclairages_ouvert","volets_ouvert","volets_ferme","portes_ouvert","portes_ferme","variateurs_ouvert","variateurs_ferme"};
    		for (String type : equip){
    		String fichierIn = "C:/wamp/www/Klog/Temp/" + type + ".csv";//Variable fichierIn de type String contenant le chemin du fichier csv source
    		File fichierCSV = new File(fichierIn);//Création objet fichierCSV de type File dans le quel on met fichierIn
    		List<String[]> myEntries; //myEntries est une liste de Liste de tableau de String
    		try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {//reader est un objet de classe CSVReader auquel on passe le fichierIn en argument
    			myEntries = reader.readAll(); //Le contenu du fichierIn lu est passé dans myEntries					
     
    			List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
    			    .skip(1)//on saute la 1ere ligne d'entête
    				.map(Donnees::new) // qu'on converti en Stream<Donnee>
    				.collect(Collectors.groupingBy(Donnees::getDate,
    							Collectors.groupingBy(Donnees::getTime,
    							Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donc les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
    	            .values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipement et valeur liste de donnees
    	            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
    	            .flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
    	            .flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
    			    	.collect(Collectors.toList()); // on transforme le stream résultant en liste (de données) (List<Donnees>)
     
    				Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream 
    					.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
    	                        Collectors.groupingBy( Donnees::getTime, // puis par heure
    	                        Collectors.groupingBy(Donnees::getEquipement,
    	                        Collectors.reducing(0L, a->1L, (a,b)->1L)
    	                        )))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>										
     
    				Set<String> equipements = map.entrySet().stream()
    						.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
    			            .flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
    							.collect(Collectors.toCollection(TreeSet::new));
     
    			for (String equipe1 : equipements)
    			{
    				String csv = "C:/wamp/www/Klog/Data/" + equipe1 + ".csv";					
    				File fichierOut = new File(csv);
    				PrintStream out = new PrintStream(new FileOutputStream (fichierOut)); 
    				out.println("date," + equipe1);	//Ecriture de l'entête
     
    				//Code permettant la mise en formme de le date et des données pour chaque ligne du csv avec "0" considéré comme "null"
    				map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    					.forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey()) 
    						.peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
    							.forEach(etime-> out.println(etime.getValue().get(equipe1))));
    				out.close();
    			}
    	}
    	catch (NumberFormatException e){
    	       System.out.println("not a number"); 					
    	} 	
    	}
     
    	}
     
    }

  20. #80
    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
    Ils servent à quoi tes tableaux files et fis ? Et la fermeture des inputstream nom d'une pipe ???



    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
     
    PrintStream[] outs = new PrintStream[nbEquip];		
    try {
        for (String nEquipe : nomEquip){
             File file = new File(outputFileCSV + nEquipe + ".csv"); 
             outs[i] = new PrintStream(new FileOutputStream(file));		
             i++;
        }
        ParserFichier klogParser = new ParserFichier();
        klogParser.parse(inputFile, frLang, outs);
    }
    finally {
        for(int i=0; i<outs.length; i++) {
               if ( outs[i]!=null ) {
                     outs[i].close();
               }
        }
    }
    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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/04/2012, 15h15
  2. [Toutes versions] Afficher l'heure dans une barre de menus personnalisés
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 24/11/2010, 09h58
  3. Afficher l'heure dans une jsp
    Par Manitobaa dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2009, 12h44
  4. Réponses: 5
    Dernier message: 25/04/2008, 19h15
  5. Réponses: 5
    Dernier message: 07/06/2006, 12h11

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