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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    Par défaut Afficher l'heure associée à une activité depuis un csv.
    Bonjour,
    Les données utilisées par le graph (C3.js) sont issues d'un csv.
    Je parviens, grâce à joel.drigo à créer mes csv finaux mais sans l'heure, or, je souhaiterai que l'heure où s'est produite une activité apparaisse également dans mes fichiers csv. Comment pourrai je m'y prendre ?

    Nom : interface Klog test2.jpg
Affichages : 466
Taille : 134,7 Ko

    Après import de java.time.LocalTime & java.time.format.DateTimeFormatter, j'ai tenté quelques modifications mais rien n'y a fait.
    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
     
    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 < 7; i++){						
    			if (cpt == 0){type = "eclairages.csv";}			
    			if (cpt == 1){type = "volets.csv";}			
    			if (cpt == 2){type = "portes.csv";}			
    			if (cpt == 3){type = "plan_de_W.csv";}
    			if (cpt == 4){type = "compteurs.csv";}			
    			if (cpt == 5){type = "capteurs.csv";}			
    			if (cpt == 6){type = "fenetres.csv";}
     
    			//Lecture du fichier source	
    			String chemin = "/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
     
    			cpt++;			
     
    			// Ecriture via PrintStream dans un fichier
    			String csv = "/home/pi/KNX/logs/data/" + type;
    			File fichierOut = new File(csv);
    			PrintStream out = new PrintStream(new FileOutputStream (fichierOut)); 
     
    			// on commence par lire le csv, on récupère une liste de tableau de String
    			List<String[]> myEntries;
    			try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {
    				myEntries = reader.readAll();				
     
    				Map<LocalDate, Map<String, Integer>> map = myEntries.stream() // on parcourt la liste de String[] par stream
    				//Map<LocalDate, Map<LocalTime, Map<String, Integer>>> map = myEntries.stream() // on parcourt la liste de String[] par stream
    				        .skip(1) // on passe la ligne de titres
    					.map(Donnees::new) // on transforme chaque ligne en instance de Donnees
    					.collect(Collectors.groupingBy(Donnees::getDate, Collectors.groupingBy(Donnees::getEquipement))) // on groupe par date, on obtient une Map<LocalDate, Map<String, List<Donnees>>>
    					.entrySet().stream() // on reparcourt les entrées de la map Map<LocalDate, Map<String, List<Donnees>>>, pour la convertir en Map<LocalDate, Map<String, Integer>>
    					.collect(Collectors.toMap(e -> e.getKey(), // on conserve la date comme clef
    							e -> e.getValue().entrySet() // on transforme la Map<String, Donnees> en Map<String, Integer> pour n'avoir que les  comptes
    										.stream().collect(Collectors.toMap(ee -> ee.getKey(), // la clef est le nom de l'équipement
    														ee -> ee.getValue().size())))); // la valeur le nombre de Donnees associés (la taille de la liste de Donnees) au nom d'équipement
     
    				       // on produit le résultat
    					out.print("date,");
    					// on récupère tous les noms d'équipement, triés par ordre alphabétique (on utiliser un tri pour avoir un ordre cohérent entre titres et lignes de données)
    					Set<String> equipements = map.entrySet().stream()
    				                                .flatMap(e -> e.getValue().keySet().stream()) // on a une Map<Date, Map<String, et on veut un set de String, il faut donc remonter la liste de clef de la seconde map au niveau de la première, ce que flatMap permet 
    								.collect(Collectors.toCollection(TreeSet::new)); // le TreeSet pour trier dans l'ordre naturel (il suffit de passer un comparateur pour changer l'ordre)
     
    					out.println(equipements.stream().collect(Collectors.joining(","))); // la liste des noms d'équipements, séparés par des virgules
     
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey()) // on tri par date (les clefs)
    								.peek(e -> out.print(e.getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // la  clef c'est la date (on affiche donc la date, avec la virgule qui suit)
    								//.peek(e -> out.print(e.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ","))
    								.forEach(e -> out.println(equipements.stream() // on parcourt les équipements pour afficher les colonnes dans le même ordre que les titres
    										.map(eq -> e.getValue().getOrDefault(eq, 0)) // on récupère le compte correspondant  à l'équipement dans la map (ou 0 s'il y en a aucun)
    										.map(String::valueOf) // on a récupérer des Integer, on doit les transformer en String pour pouvoir utiliser Collectors.joining, pour afficher la liste des nombres séparés par des virgules
    				                                                .collect(Collectors.joining(",")))); // on affiche la liste
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Je mets un exemple de fichier csv:
    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
     
    idIndex,date,heure,participant,adresseParticipant,equipement,adresseBus,valeur
    1,15-03-2017,09:07:26,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42C4
    7,15-03-2017,09:07:47,Indefini,1.1.103,Consommation_Energie_Plaques,4/0/1,0000
    16,15-03-2017,09:08:18,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    27,14-03-2017,09:08:51,Indefini,1.1.103,Consommation_Energie_Prises_Cuisines,4/0/2,0001
    40,16-03-2017,09:09:22,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42C4
    53,15-03-2017,09:10:01,Indefini,1.1.103,Consommation_Puissance_Prises_Cuisines,4/1/2,0000
    56,15-03-2017,09:10:13,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    57,15-03-2017,09:10:13,Indefini,1.1.103,Consommation_Energie_Plaques,4/0/1,0000
    75,15-03-2017,09:11:11,Indefini,1.1.103,Consommation_Energie_Prises_Cuisines,4/0/2,0001
    77,15-03-2017,09:11:18,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42BE
    92,15-03-2017,09:12:07,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    102,15-03-2017,09:12:38,Indefini,1.1.103,Consommation_Energie_Plaques,4/0/1,0000
    111,15-03-2017,09:13:14,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42C0
    113,15-03-2017,09:13:17,Indefini,1.1.103,Consommation_Puissance_Plaques,4/1/1,0000
    121,15-03-2017,09:13:37,Indefini,1.1.103,Consommation_Energie_Prises_Cuisines,4/0/2,0001
    128,15-03-2017,09:14:01,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    143,15-03-2017,09:14:54,Indefini,1.1.103,Consommation_Puissance_Prises_Cuisines,4/1/2,0000
    146,15-03-2017,09:15:04,Indefini,1.1.103,Consommation_Energie_Plaques,4/0/1,0000
    148,15-03-2017,09:15:06,Capteur_Zenio_Chambre_SDB,1.1.39,Consommation_Energie_Prises_Cuisines,4/0/2,10
    149,15-03-2017,09:15:10,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42BE
    166,15-03-2017,09:16:01,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    167,15-03-2017,09:16:03,Indefini,1.1.103,Consommation_Energie_Prises_Cuisines,4/0/2,0001
    189,15-03-2017,09:17:06,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42C0
    194,15-03-2017,09:17:29,Indefini,1.1.103,Consommation_Energie_Plaques,4/0/1,0000
    204,15-03-2017,09:17:55,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    210,15-03-2017,09:18:10,Indefini,1.1.103,Consommation_Puissance_Plaques,4/1/1,0000
    Voila si quelqu'un peut m'aider.
    Merci d'avance.

  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 : 56
    Localisation : France, Paris (Île de France)

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

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

    Dans ton CSV, la date et l'heure sont dans 2 colonnes séparées, c'est pour ça que dans Donnees, j'avais mis les 2 champs, date et time, séparé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
    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
     
    package traitementCSV;
     
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
     
    public class Donnees {
     
    	private int id;
    	private LocalDate date;
    	private LocalTime time;
    	private String participant;
    	private String addresse;
    	private String equipement;
    	private String addressebus;
    	private String value;
     
    	public Donnees(String... data) {
    		this.id = Integer.parseInt(data[0]);
    		this.date = LocalDate.parse(data[1], DateTimeFormatter.ofPattern("dd-MM-yy"));
    		this.time = LocalTime.parse(data[2], DateTimeFormatter.ofPattern("HH:mm:ss"));
    		this.participant = data[3];
    		this.addresse = data[4];
    		this.equipement = data[5];
    		this.addressebus = data[6];
    		this.value = data[7];
    	}
     
    	public int getId() {
    		return id;
    	}
     
    	public LocalDate getDate() {
    		return date;
    	}
     
    	public LocalTime getTime() {
    		return time;
    	}
     
    	public LocalDateTime getDateTime() {
    		return LocalDateTime.of(date, time);
    	}
     
    	public String getParticipant() {
    		return participant;
    	}
     
    	public String getAddresse() {
    		return addresse;
    	}
     
    	public String getEquipement() {
    		return equipement;
    	}
     
    	public String getAddresseBus() {
    		return addressebus;
    	}
     
    	public String getValue() {
    		return value;
    	}
    }
    Mais j'avais mis également un accesseur qui fusionnait les deux : public LocalDateTime getDateTime(), dont tu peux retrouver l'heure par toLocalTime().

    Maintenant, ta question manque de précision. Tu parles de csv final, mais pas de ce qu'il y a dedans. Le code que tu montres correspond à la réponse à ta première question sur le sujet : groupe par date. A partir du moment ou tu as grouper par date, on ne peut plus déterminer l'heure. On a cumuler pour chaque groupe, on ne connait plus le détail. Mais on peut procéder de la même manière, pour grouper d'abord par date, puis par time (dans la même date).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Map<LocalDate, Map<String, Integer>> map = myEntries.stream() // on parcourt la liste de String[] par stream 
    				        .skip(1) // on passe la ligne de titres
    					.map(Donnees::new) // on transforme chaque ligne en instance de Donnees
    					.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
                                                       Collectors.groupingBy( Donnees::getTime , // puis par heure
                                                       Collectors.groupingBy(Donnees::getEquipement)))) // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>
     
               ...
    En modifiant la suite pour traiter une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>, au lieu d'une Map<LocalDate, Map<String, List<Donnees>>>, tu peux obtenir une Map<LocalDate, Map<LocalTime, Map<String, Integer>>>, au lieu d'une Map<LocalDate, Map<String, Integer>>.

    Dans une autre discussion, je t'avais donné le moyen de convertir ton csv en liste de Donnee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Donnees> data = myEntries.stream() // on parcourt la liste de String[] par stream
                               .skip(1) // on passe la ligne de titres
                               .map(Donnees::new) // on transforme chaque ligne en instance de Donnees
                               .collect(Collectors.toList()); // transforme le stream en liste de Data
    Avec ça, tu as directement ton csv :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<String> csvList = data.stream()
                     .map(d-> Arrays.asList( d.getTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")), d.getEquipement(), d.getParticipant()).stream().collect(Collectors.joining(",")) // permet de concaténer les valeurs qu'on veut exporter de Donnee en une ligne csv (comma separated values) 
                     .collect(Collectors.toList());
    On peut combiner les deux si on veut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<String> csvList = data.stream()
                     .map(d-> Arrays.asList( // je transforme en liste pour plus facilement faire le joining
                                        d.getTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")), // l'heure au format HH:mm:ss
                                        d.getEquipement(),  // le nom de l'équipement
                                        d.getParticipant(), // le participant
                                        // on peut mettre d'autres champs si on veut
                                        map.get( d.getDate() ).get( d.getTime() ).get( d.getEquipement( )) // par exemple, on ajoute le compte cumulé  groupé par data/time/equipement (le mapping existe forcément)
     
                                    )
                                   .stream().collect(Collectors.joining(",")) // permet de concaténer les valeurs qu'on veut exporter de Donnee en une ligne csv (comma separated values) 
                     .collect(Collectors.toList());
    Ce qui te permettra de construire un csv du type :
    Time, Equipement, Participant, Nombre
    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 confirmé 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
    Par défaut
    Salut et merci de ta réponse,
    tu as raison, je ne suis pas suffisamment précis dans ma question.
    Mon csv final devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    date,heure,Consommation_Energie_General,Consommation_Energie_Plaques,Consommation_Energie_Prises_Cuisines,Consommation_Puissance_General,Consommation_Puissance_Plaques,Consommation_Puissance_Prises_Cuisines
    2017-03-13,0,0,0,0,0,1
    2017-03-14,0,0,1,0,0,0
    2017-03-15,14,12,11,14,5,5
    2017-03-16,0,0,0,1,0,0
    J'ai bien une entête "heure" mais je ne parviens pas à récupérer les heures en dessous.
    Je souhaiterai conserver les autres données mais avoir en plus les heures de chaque action des équipements.

  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 : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Je ne vois pas l'heure dans ton csv, mais je suppose que tu as juste oublié d'insérer une deuxième colonne avec une heure...

    Donc, si c'est bien ça, je t'ai donné la solution dans mon message précédent. Tu ne groupes plus par date puis équipement, mais par date, time puis équipeement, avec une ventilation plus détaillée des comptes cumulés. Je t'ai donnée la solution pour la construction de la map de groupement. Tu dois reprendre le traitement qui servait à recréer le tableau croisé final. Tu devrais être capable de le faire tout seul, au vu de tout ce que je t'ai montré.

    Je parle de ce code à transformer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .entrySet().stream() // on reparcourt les entrées de la map Map<LocalDate, Map<String, List<Donnees>>>, pour la convertir en Map<LocalDate, Map<String, Integer>>
    				.collect(Collectors.toMap(e -> e.getKey(), // on conserve la date comme clef
    						e -> e.getValue().entrySet() // on transforme la Map<String, Donnees> en Map<String, Integer> pour n'avoir que les  comptes
    									.stream().collect(Collectors.toMap(ee -> ee.getKey(), // la clef est le nom de l'équipement
    													ee -> ee.getValue().size())))); // la valeur le nombre de Donnees associés (la taille de la liste de Donnees) au nom d'équipement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .entrySet().stream() // on reparcourt les entrées de la map Map<LocalDate, Map<LocalTime<Map<String, List<Donnees>>>>, pour la convertir en Map<LocalDate, Map<LocalTime, Map<String, Integer>>>
    /*... etc ...*/
    Parcourir le résultat du traitement , ensuite, pour recréer les lignes du CSV LocalDate, LocalTime, compte equipement 1, compte equipement 2, compteur equipement 3....
    Ce qui était fait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    map.entrySet().stream().sorted(Map.Entry.comparingByKey()) // on tri par date (les clefs)
    							.peek(e -> out.print(e.getKey().format(DateTimeFormatter.ofPattern("dd-MM-yy")) + ",")) // la  clef c'est la date (on affiche donc la date, avec la virgule qui suit)
    							.forEach(e -> out.println(equipements.stream() // on parcourt les équipements pour afficher les colonnes dans le même ordre que les titres
    									.map(eq -> e.getValue().getOrDefault(eq, 0)) // on récupère le compte correspondant  à l'équipement dans la map (ou 0 s'il y en a aucun)
    									.map(String::valueOf) // on a récupérer des Integer, on doit les transformer en String pour pouvoir utiliser Collectors.joining, pour afficher la liste des nombres séparés par des virgules
    			                                                .collect(Collectors.joining(",")))); // on affiche la liste
    Toujours appliquer le même principe é (sauf qu'au lieu d'une map de map en entrée, tu auras une map de map de map), donc juste un niveau de clef supplémentaire.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé 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
    Par défaut
    J'avais déjà tenté en modifiant le code de cette ligne comme cela dans le 1er post que j'ai fais (ligne commentée).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Map<LocalDate, Map<LocalTime, Map<String, Integer>>> map = myEntries.stream()
    J'ai également modifié cette ligne comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .collect(Collectors.groupingBy(Donnees::getDate, Collectors.groupingBy(Donnees::getTime, Collectors.groupingBy(Donnees::getEquipement))))
    Mais ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    e -> e.getValue().entrySet() // on transforme la Map<String, Donnees> en Map<String, Integer>
    .stream().collect(Collectors.toMap(ee -> ee.getKey(),
    ee -> ee.getValue().size()))));
    me renvoyaient cette erreur :
    Non concordance de types*: impossible de convertir de Map<Object,Object> en Map<LocalTime,Map<String,List<Donnees>>>
    Par ailleurs, je me demande si ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<String> csvList = data.stream()
                     .map(d-> Arrays.asList( // je transforme en liste pour plus facilement faire le joining
                                        d.getTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")), // l'heure au format HH:mm:ss
                                        d.getEquipement(),  // le nom de l'équipement
                                        d.getParticipant(), // le participant
                                        // on peut mettre d'autres champs si on veut
                                        map.get( d.getDate() ).get( d.getTime() ).get( d.getEquipement( )) // par exemple, on ajoute le compte cumulé  groupé par data/time/equipement (le mapping existe forcément)
     
                                    )
                                   .stream().collect(Collectors.joining(",")) // permet de concaténer les valeurs qu'on veut exporter de Donnee en une ligne csv (comma separated values) 
                     .collect(Collectors.toList());
    Me permettrait de faire ce que je veux vu que tu dis qu'il donnerait un csv de type :
    Time, Equipement, Participant, Nombre
    Donc sans Date.

    Merci & bonne soirée.

  6. #6
    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 : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gadje Voir le message
    J'avais déjà tenté en modifiant le code de cette ligne comme cela dans le 1er post que j'ai fais (ligne commentée).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Map<LocalDate, Map<LocalTime, Map<String, Integer>>> map = myEntries.stream()
    J'ai également modifié cette ligne comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .collect(Collectors.groupingBy(Donnees::getDate, Collectors.groupingBy(Donnees::getTime, Collectors.groupingBy(Donnees::getEquipement))))
    Mais ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    e -> e.getValue().entrySet() // on transforme la Map<String, Donnees> en Map<String, Integer>
    .stream().collect(Collectors.toMap(ee -> ee.getKey(),
    ee -> ee.getValue().size()))));
    me renvoyaient cette erreur :
    Le problème est que tu essayes de transformer une expression qui traite une Map<Type1, List<Type3>> en expression qui traite une Map<Type1, Map<Type2, List<Type3>> en l'appliquant à la Map<Type1, ...>, alors que cette expression ne peut fonctionner que sur Map<Type2, ...>, et pour retrouver la Map globale, il fautdrait remapper Map<Type1, ...> tel que ses valeurs soit le résultat de l'expression.

    On va simplifier le problème en utilisant counting(), ce qui te donnera directement un comptage, au lieu de Map<Strng, List<Donnees>>, ça te donnera un Map<String, Long> (Long au lieu de Integer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .collect(Collectors.groupingBy(Donnees::getDate, 
                      Collectors.groupingBy(Donnees::getTime, 
                      Collectors.groupingBy(Donnees::getEquipement,
                      Collectors.counting()
    ))))
    Mais l'expression avec Map<String, Map<String, List<Data>> aurait dû être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stream(). // la on a un Stream de entry de  Map.Entry, String -> Map<String, List<Data>>, qu'on veut transformer en String -> Map<String, Integer> 
    .collect(Collectors.toMap( e-> e.getKey(), la clef change pas
    e.getValue().entrySet().collect( Collectors.toMap( e2-> e2.getKey(), // la clef dans  la sous map
                    e2-> e2.getValue().size() // la valeur est le nombre de valeur dans la liste (getValue() c'est une List<Donnees> 
    ))

    Citation Envoyé par gadje Voir le message
    Par ailleurs, je me demande si ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<String> csvList = data.stream()
                     .map(d-> Arrays.asList( // je transforme en liste pour plus facilement faire le joining
                                        d.getTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")), // l'heure au format HH:mm:ss
                                        d.getEquipement(),  // le nom de l'équipement
                                        d.getParticipant(), // le participant
                                        // on peut mettre d'autres champs si on veut
                                        map.get( d.getDate() ).get( d.getTime() ).get( d.getEquipement( )) // par exemple, on ajoute le compte cumulé  groupé par data/time/equipement (le mapping existe forcément)
     
                                    )
                                   .stream().collect(Collectors.joining(",")) // permet de concaténer les valeurs qu'on veut exporter de Donnee en une ligne csv (comma separated values) 
                     .collect(Collectors.toList());
    Me permettrait de faire ce que je veux vu que tu dis qu'il donnerait un csv de type :
    Oui,

    1. sauf qu'il y juste un petit truc qui manque : la conversion du compte (un nombre) en String :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      List<String> csvList = data.stream()
                       .map(d-> Arrays.asList( // je transforme en liste pour plus facilement faire le joining
                                          d.getTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")), // l'heure au format HH:mm:ss
                                          d.getEquipement(),  // le nom de l'équipement
                                          d.getParticipant(), // le participant
                                          // on peut mettre d'autres champs si on veut
                                          map.get( d.getDate() ).get( d.getTime() ).get( d.getEquipement( ).toString()) // par exemple, on ajoute le compte cumulé  groupé par data/time/equipement (le mapping existe forcément)
       
                                      )
                                     .stream().collect(Collectors.joining(",")) // permet de concaténer les valeurs qu'on veut exporter de Donnee en une ligne csv (comma separated values) 
                       .collect(Collectors.toList());
    2. sauf que
      Pour plusieurs date différente, tu peux avoir la même heure... donc avec çà, tu risque d'avoir des lignes avec la première colonne en double, sans information pour les distinguer (la date). Mais si c'est vraiment ce que tu veux, pas de souci
    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