1. #1
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    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 : 25
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/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    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
    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 à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    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/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    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.
    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 à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    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/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    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
    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.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Bonjour,
    donc je modifie cette ligne :
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> map = myEntries.stream()
    Telle qu'elle?

    J'ajoute :
    Collectors.groupingBy(Donnees::getTime, //Pour récupérer le contenu de ma colonne heure
    et
    Collectors.counting()
    Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new) 
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement,
    								Collectors.counting()
    					)))
    Est-ce bien cela ?

    Actuellement, mon code ressemble à cela:
    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
     
    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";}
    			String chemin = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
    			cpt++;			
    			String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + type;
    			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();		
     
                            Map<LocalDate, Map<LocalTime, Map<String, Integer>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement)))
    					.entrySet().stream()
    					.collect(Collectors.toMap(e -> e.getKey(),
    							e -> e.getValue().entrySet()
    										.stream().collect(Collectors.toMap(ee -> ee.getKey(),
    														ee -> ee.getValue().size())))
    					out.print("date,heure,");
    					Set<String> equipements = map.entrySet().stream()
    				                                .flatMap(e -> e.getValue().keySet().stream())
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));				 
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    								.peek(e -> out.print(e.getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ","))
    								.forEach(e -> out.println(equipements.stream()
    										.map(eq -> e.getValue().getOrDefault(eq, 0))
    										.map(String::valueOf)
    				                                                .collect(Collectors.joining(","))));
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Je ne vois pas comment fonctionne cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    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> 
    ))
    Ni à quelle endroit la mettre.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par gadje Voir le message
    Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new) 
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement,
    								Collectors.counting()
    					)))
    Est-ce bien cela ?
    Pas tout à fait, parce que avec le counting, tu n'obtiens plus de List<Donnees> mais un Long à la place, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Map<LocalDate, Map<LocalTime, Map<String, Long>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new) 
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement,
    								Collectors.counting()
    					)))
    A supposer que myEntries est une List<String[]> (ou tout autre fournisseur de Stream<String[]>)

    Citation Envoyé par gadje Voir le message
    Actuellement, mon code ressemble à cela (pour date,time,equipement,...:
    Il va devenir :
    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
    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";}
    			String chemin = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
    			cpt++;			
    			String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + type;
    			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();		
    		
                            Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement, Collectors.counting()))) ;
    					/*.entrySet().stream()
    					.collect(Collectors.toMap(e -> e.getKey(),
    							e -> e.getValue().entrySet()
    										.stream().collect(Collectors.toMap(ee -> ee.getKey(),
    														ee -> ee.getValue().size())))*/
    					out.print("date,heure,");
    					Set<String> equipements = map.entrySet().stream()
    				                                .flatMap(e -> e.getValue().keySet().stream())
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));				 
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    								.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
                                                                    .forEach(edate -> edate.entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                                                                                    .peek(etime->  out.print(etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
                                                                                    .forEach(etime-> 
                                                                                    .out.println(equipements.stream()
    										.map(eq -> etime.getValue().getOrDefault(eq, 0))
    										.map(String::valueOf)
    				                                                .collect(Collectors.joining(","))));
    				
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Citation Envoyé par gadje Voir le message
    Je ne vois pas comment fonctionne cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    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> 
    ))
    Lorsqu'on voulait convertir une Map associant un String et un List<Donnees>, on a utiliser un collector qui créait une Map telque la clef soit la clef de la première et la valeur la taille de la valeur de la première Map (la valeur de la première étant une List).
    Avec une Map<String, Map<String, List<Donnees>>> on a un niveau de map en plus, donc on chercher à faire la même chose que précédemment pour la sous map, et à convertir la première map telle que sa clef soit la même (que dans la map d'origine) et que sa valeur soit le résultat de la conversion de la sous-map.
    (j'ai juste oublié le début dans la lambda dans la partie valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    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-> 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> 
    ))
    La méthode Collectors.toMap() prend 2 Function en paramètre ici : la première pour déterminer la clef (à partir de ce qu'on a dans le stream, c'est à dire une Map.Entry), et la seconde pour déterminer la valeur associée à cette clef, ici le résultat de la transformation de la valeur de la Map.Entry, qui une Map<String, List<Donnes>> en Map<String, Integer>, la même transformation qu'on avait avant que tu introduises un niveau supplémentaire (le premier code que je t'avais montré), donc exactement la même chose, mais à un niveau en-dessous, et pas directement le résultat final de l'expression entière.

    Citation Envoyé par gadje Voir le message
    Ni à quelle endroit la mettre.
    Nulle part : je te donnais juste la façon de faire pour convertir une Map<String, Map<String, List<Donnees>> (et pas Data comme j'avais écris), en Map<String, Map<String, Integer>>, mais la solution avec le counting() fait qu'on n'a plus besoin de cette conversion (on obtient à la place de List<Donnees> un Long qui est le nombre d'éléments de la List directement).

    A noter que tu pourrais simplifier aussi le début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    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";}
    			String chemin = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
    			cpt++;
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] types = {"eclairages.csv", "volets.csv", "portes.csv", "plan_de_W.csv", "compteurs.csv", "capteurs.csv", "fenetres.csv" };
    for(String type : types ) {
    File fichierCSV = new File("D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv",type);
    Et pour fermer correctement ton outputStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try(PrintStream out = new PrintStream(new FileOutputStream (fichierOut))) {
    }
    plus besoin d'appeler close(), mais il sera fait même en cas d'exception dans le bloc (ce qui n'est pas le cas dans ton code).
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Je viens de tenter de modifier mon code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement,
    								Collectors.counting()
    					)))) 
    					stream().collect(Collectors.toMap(e -> e.getKey(),
    					e.getValue().entrySet().collect( Collectors.toMap( ee-> ee.getKey(),
    							ee -> ee.getValue().size()
                                            ))));
    Mais j'ai encore et toujours un problème de typage.

    J'ai également essayé de modifier le code en utilisant un type long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<LocalDate, Map<LocalTime, Map<String, Long>>>
    Et là j'ai un problème de parenthèses.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Super, je te remercie. J'ai cependant le même pb de parenthèses avec le code modifié par tes soins.
    J'ai bien vérifié et pas de parenthèses en trop ou manquantes, je ne vois rien de particulier.
    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
     
    Collectors.groupingBy(Donnees::getEquipement, Collectors.counting())))) ;
    					/*.entrySet().stream()
    					.collect(Collectors.toMap(e -> e.getKey(),
    							e -> e.getValue().entrySet()
    										.stream().collect(Collectors.toMap(ee -> ee.getKey(),
    														ee -> ee.getValue().size())))*/
    					out.print("date,heure,");
    					Set<String> equipements = map.entrySet().stream()
    				                                .flatMap(e -> e.getValue().keySet().stream())
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));				 
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    								.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
                                                                    .forEach(edate -> edate.entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                                                                                    .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // time,
                                                                                    .forEach(etime-> 
                                                                                    .out.println(equipements.stream()
    										.map(eq -> etime.getValue().getOrDefault(eq, 0))
    										.map(String::valueOf)
    				                                                .collect(Collectors.joining(","))));
    Je te mets une capture
    Nom : Erreur parenthèses.jpg
Affichages : 12
Taille : 110,0 Ko
    Merci beaucoup.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Ne pas tenir compte de la 1ere erreur, corrigée.

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    Billets dans le blog
    2

    Par défaut

    Le . devant le out c'est une erreur de copier/coller : il ne peut y avoir de . devant une instruction bien sûr. Il suffit de l'enlever.
    Pour l'erreur de parenthèse, il est possible qu'elle soit conséquente à celle du point.
    Normalement, si j'en loupe pas, il en faut :
    1. pour le forEach(edate-> ...
    2. pour le forEach(etime-> ...
    3. pour le collect(
    4. joining(
    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.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    J'ai toujours un pb avec les 2 dernières parenthèses.
    Mais je me demandais également si pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // time,
    Je ne dois pas plutôt indiquer le format de l'heure, genre HH:MM:SS, ou quelque chose comme ça?

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par gadje Voir le message
    J'ai toujours un pb avec les 2 dernières parenthèses.
    Mais je me demandais également si pour cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .peek(etime->  out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // time,
    Je ne dois pas plutôt indiquer le format de l'heure, genre HH:MM:SS, ou quelque chose comme ça?
    Non, une parenthèse fermante pour le out.print( et un pour le peek(. Mais il y a une erreur : edate c'est la clef de niveau supérieur, ici ça devrait être etime.

    Oui pour le format d'heure (HH:mm:ss) (c'est bien que ce que j'ai indiqué dans mon exemple (.peek(etime-> out.print(etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ","))) (j'avais juste oublié la parenthèse ( entre peek et etime (j'avais écrit peeketime, corrigé dans mon post initial).
    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.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Hé bien !!! Même après avoir fait les modifications nécessaires, j'ai encore ce problème de parenthèses. Tout le reste semble ok.
    Les erreurs se situent au niveau de la dernière parenthèse de cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .map(eq -> etime.getValue().getOrDefault(eq, 0))
    Et de celle-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .collect(Collectors.joining(","))));
    J'ai revérifié le nombre de parenthèses, je ne vois rien de particulier, pouvant être à l'origine de ces erreurs.

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    Billets dans le blog
    2

    Par défaut

    Tu peux me remontrer ton code complet ?

    Une méthode pour résoudre les problèmes de parenthèse : tout commenter puis décommenter progressivement pas bloc.

    Sinon utiliser le petit programme suivant, qui donne quelques indications :
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    import java.io.IOException;
    import java.io.PrintStream;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.ArrayDeque;
    import java.util.Collections;
    import java.util.Deque;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.stream.Collectors;
     
    public class BalancingReport {
     
    	private static final Map<Character,Character> BALANCED_OPEN = createMap();
    	private static final Map<Character,Character> BALANCED_CLOSE = BALANCED_OPEN.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
    	private static Map<Character, Character> createMap() {
    		Map<Character,Character> map = new HashMap<>();
    		map.put('(', ')');
    		map.put('{', '}');
    		map.put('[', ']');
    		return Collections.unmodifiableMap(map);
    	}
     
    	private enum State {
    		COMMENT_BEGIN,
    		COMMENT_OPEN,
    		COMMENT_CLOSE, 
    		COMMENT,
    		ESCAPE,
    		STRING,
    		OTHER
    	}
     
    	private int lineStart=0;
    	private int lineCount=1;
    	private int charCount=1;
    	private final PrintStream out;
    	private final Deque<State> states = new ArrayDeque<>();
    	private final Deque<Balanced> stack = new ArrayDeque<>(); 
    	public BalancingReport(Path path, PrintStream out) throws IOException {
    		this.out=out;
    		Files.lines(path).forEach(this::handle);
    	}
     
    	private void handle(String line) {
    		for(char c : line.toCharArray()) {
    			handle(c);
    			charCount++;
    		} 
    		handle('\n'); 
    		lineStart=charCount;
    		lineCount++;
    	}
     
    	private State getState() {
    		if ( states.isEmpty() ) {
    			return State.OTHER;
    		}
    		return states.peek();
    	}
     
    	private void handle(char c) {
    		switch(getState()) {
    		case ESCAPE:
    			states.pop();
    			break;
    		case STRING:
    			switch(c) {
    			case '\"':
    				states.pop();
    				break;
    			case '\\':
    				states.push(State.ESCAPE);
    				break;
    			default:
    				break;
    			}
    			break;
    		case COMMENT_BEGIN:
    			switch (c) {
    			case '/':
    				states.pop();
    				states.push(State.COMMENT);
    				break;
    			case '*':
    				states.pop();
    				states.push(State.COMMENT_OPEN);
    				break;
    			default:
    				states.pop();
    				break;
    			}
    			break;
    		case COMMENT_OPEN:
    			switch (c) {
    			case '*':
    				states.pop();
    				states.push(State.COMMENT_CLOSE);
    				break;
    			default:
    				break;
    			}
    			break; 
    		case COMMENT_CLOSE:
    			switch (c) {
    			case '/':
    				states.pop();
    				break;
    			default:
    				states.pop();
    				states.push(State.COMMENT_OPEN);
    				break;
    			}
    			break;
    		case COMMENT:
    			switch(c) {
    			case '\n':
    				states.pop();
    				break;
    			default:
    				break;
    			}
    			break;
    		default:
    			switch (c) {
    			case '/':
    				states.push(State.COMMENT_BEGIN);
    				break;
    			case '\"':
    				states.push(State.STRING);
    				break;
    			default:
    				final Character close = BALANCED_OPEN.get(c);
    				if(close!=null) {
    					stack.push(new Balanced(c, lineCount, charCount-lineStart+1));
    				}
    				else {
    					Character open = BALANCED_CLOSE.get(c);
    					if ( open!=null ) {
    						if ( stack.isEmpty() ) {
    							out("Premature " + c + ".");
    						}
    						else {
    							Balanced balanced = stack.peek();
    							if ( open.equals(balanced.c) ) {
    								stack.pop();
    							}
    							else {
    								out("Misplaced '" + c + "' (should be '" + BALANCED_OPEN.get(balanced.c) +"' corresponding to '" + balanced.c + "' at "+formatPos(balanced.line, balanced.pos).toLowerCase()+").");
    							}
    						}
    					}
    				}
    				break;
    			}
    			break;
    		}
    	} 
     
    	private void out(String msg) {
    		out.print(formatPos(lineCount, charCount-lineStart+1));
    		out.print(": "); 
    		out.println(msg);
    	}
     
    	private String formatPos(int line, int pos) {
    		return String.format("Line=%d pos=%d",line,pos);
    	}
     
    	private static class Balanced {
    		public final char c;
    		public final int line; 
    		public final int pos;
    		public Balanced(char c, int line, int pos) {
    			this.line=line;
    			this.pos=pos; 
    			this.c=c;
    		}
    	}
     
    	public static void main(String[] args) { 
    		try {
    			new BalancingReport(Paths.get(args[0]),System.out);
    		} catch (IOException e) { 
    			e.printStackTrace();
    		}
    	} 
     
    }
    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. #17
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Voila ma classe "EntreeTraitement" (main) :
    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
     
    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";}
    			String chemin = "/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
    			cpt++;			
    			String csv = "/home/pi/KNX/logs/data/" + type;
    			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();		
     
                            Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement, Collectors.counting())))) ;
    					/*.entrySet().stream()
    					.collect(Collectors.toMap(e -> e.getKey(),
    							e -> e.getValue().entrySet()
    										.stream().collect(Collectors.toMap(ee -> ee.getKey(),
    														ee -> ee.getValue().size())))*/
    					out.print("date,heure,");
    					Set<String> equipements = map.entrySet().stream()
    				                                .flatMap(e -> e.getValue().keySet().stream())
    								.collect(Collectors.toCollection(TreeSet::new));
    					out.println(equipements.stream().collect(Collectors.joining(",")));				 
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    								.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
                                                                    .forEach(edate -> edate.entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                                                                                    .peek(etime->  out.print(etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
                                                                                    .forEach(etime-> 
                                                                                    out.println(equipements.stream()
    										.map(eq -> etime.getValue().getOrDefault(eq, 0))
    										.map(String::valueOf)
    				                                                .collect(Collectors.joining(","))));
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}
    Et ma classe "Donnees" au cas où :
    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 miseEnFormeDonneesCSV;
     
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
     
    public class Donnees {
     
    	private String 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 = data[0];
    		this.date = LocalDate.parse(data[1], DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    		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 String getId() {
    		return this.id;
    	}
     
    	public LocalDate getDate() {
    		return this.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;
    	}
    }
    Merci encore.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    J'aurai tendance à penser que le problème vient de cette parenthèse qui ne se ferme pas :
    Qu'en penses tu ?

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    9 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : septembre 2009
    Messages : 9 219
    Points : 22 800
    Points
    22 800
    Billets dans le blog
    2

    Par défaut

    En fait, il y a plusieurs problèmes :

    1. Comme on génère une Map<LocalDate, Map<LocalTime, Map<String, Long>>> au lieu d'une Map<LocalDate, Map<String, Integer>> (soit une Map, date->time->equipement->nombre au lieu de data->equipement->nombre, l'expression pour générer la liste des equipements n'est plus correcte. On a un niveau de plus de map, donc il faut :

      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(",")));
    2. A cause des longs, il y a un problème d'inférence (de déduction automatique) du type dans .map(eq -> etime.getValue().getOrDefault(eq, 0)) à cause du 0 qui est un int, alors qu'on traite des long. Il faut donc mettre : .map(eq -> etime.getValue().getOrDefault(eq, 0L))
    3. Il y avait un problème de parenthèse également :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      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(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(",")))))   ;
      Et c'est bien celle que tu dis.
    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.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Reconversion développeur, C'EST PAS SIMPLE !!!
    Inscrit en
    mars 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Reconversion développeur, C'EST PAS SIMPLE !!!

    Informations forums :
    Inscription : mars 2010
    Messages : 42
    Points : 15
    Points
    15

    Par défaut

    Arrrrgh !!!!
    Il y a encore une erreur mais cette fois de type
    La méthode entrySet() est indéfinie pour le type Map.Entry<LocalDate,Map<LocalTime,Map<String,Long>>>
    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .forEach(edate -> edate.entrySet().stream().sorted(Map.Entry.comparingByKey())
    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
     
    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";}
    			String chemin = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/csv/" + type;
    			File fichierCSV = new File(chemin);
    			cpt++;			
    			String csv = "D:/STAGE du 29-11-16 au 23-12-16/Java/home/pi/KNX/logs/data/" + type;
    			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();		
     
                            Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = myEntries.stream()
    				        .skip(1)
    					.map(Donnees::new)
    					.collect(Collectors.groupingBy(Donnees::getDate,
    								Collectors.groupingBy(Donnees::getTime,
    								Collectors.groupingBy(Donnees::getEquipement, Collectors.counting())))) ;
     
    					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(",")));
     
    					map.entrySet().stream().sorted(Map.Entry.comparingByKey())
    								.peek(edate  -> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + ",")) // date,
                                                                    .forEach(edate -> edate.entrySet().stream().sorted(Map.Entry.comparingByKey()) 
                                                                                    .peek(etime->  out.print(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(",")))));
     
    			out.close();
    			}
    			catch (NumberFormatException e){
    			       System.out.println("not a number"); 					
    			} 	
    			}
    			}	
    		}

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/04/2012, 16h15
  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, 10h58
  3. Afficher l'heure dans une jsp
    Par Manitobaa dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2009, 13h44
  4. Réponses: 5
    Dernier message: 25/04/2008, 20h15
  5. Réponses: 5
    Dernier message: 07/06/2006, 13h11

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