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 :

[OpenCSV] Grouper des données CSV en fonction des dates


Sujet :

Documents Java

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut [OpenCSV] Grouper des données CSV en fonction des dates
    Bonjour à toutes et tous,
    Je suis actuellement sur un projet visant à récupérer des données depuis des logs d'équipements domotiques dans un fichier CSV.
    Ces données seront utilisées sous forme graphique (C3 JS), à des fins statistiques dans le domaine du handicap.
    Je ne sais pas comment faire pour grouper mes données en fonction des date.

    J'utilise OpenCSV pour le parsing de mon csv et un HashMap mais celui-ci ne prend en compte qu'une paire clé / valeur, que je parviens à afficher,
    avec le nom de chaque équipement et le nombre d'action de l'intégralité du CSV (sans groupement par date).
    Je ne vois vraiment pas comment faire pour filtrer par date tout en faisant une somme des actions enregistrées de chaque composant.
    S'il se trouvait une bonne âme pour me mettre sur la voie, ce serait fort charitable

    Mon CSV de départ ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    idIndex,date,heure,participant,adresseParticipant,equipement,adresseBus,valeur
    1,06-03-17,11:39:59,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_Chambre,5/1/3,00
    2,07-03-17,11:39:59,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_SDB,5/1/4,00
    3,06-03-17,11:40:01,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    4,07-03-17,11:40:01,Capteur_IR_Exterieur,1.1.31,Luminosite_Exterieure,5/1/0,26
    5,06-03-17,11:40:09,Capteur_Hall,1.1.30,Luminosite_Hall_Entree,5/1/1,14 
    6,06-03-17,13:37:19,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_Chambre,5/1/3,00
    7,07-03-17,15:48:03,Capteur_IR_Exterieur,1.1.31,Luminosite_Exterieure,5/1/0,26
    8,08-03-17,11:39:59,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_SDB,5/1/4,00
    2,08-03-17,09:53:09,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_SDB,5/1/4,00
    Et je voudrais qu'en sortie, il ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    date,Luminosite_Chambre,Luminosite_SDB,Consommation_Energie_General,Luminosite_Exterieure,Luminosite_Hall_Entree
    06-03-17,2,0,1,0,1
    07-03-17,0,1,0,2,0
    08-03-17,0,2,0,0,0
    Si besoin, je pourrai poster mon code de test.
    Merci.

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

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

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

    Pour faire ce genre de chose, il peut être intéressant de créer une classe pour représenter tes lignes, ce qui te permettra d'utiliser facilement les fonctions de groupement et autres des streams :

    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
     
     
    PrintStream out = System.out; // pour l'exemple, se remplace facilement par un PrintStream sur un fichier
     
    File file  = ton fichier csv
     
    // 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(file))) {
    	myEntries = reader.readAll();
    }
     
     
    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(Data::new) // on transforme chaque ligne en instance de Data
    	.collect(Collectors.groupingBy(Data::getDate, Collectors.groupingBy(Data::getEquipement))) // on groupe par date, on obtient une Map<LocalDate, Map<String, List<Data>>>
    	.entrySet().stream() // on reparcourt les entrées de la map Map<LocalDate, Map<String, List<Data>>>, 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, Data> 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 Data associés (la taille de la liste de Data) 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("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
     
    }
     
    public static class Data {
     
    	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 Data(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;
    	}
    }

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    Tout d'abord je te remercie de ta réponse.
    J'ai donc créé une classe "Donnees" permettant la mise en forme de mes données, comme suggéré, pas de pb particulier. J'ai utilisé la première partie de ton code dans mon main mais je dois avoir un problème de typage lors du traitement de certains champs de mon fichier csv.
    Si tu pouvais me faire bénéficier de tes lumières, je t'en serai reconnaissant.

    Mon joli message d'erreur :

    Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at traitementCSV.Donnees.<init>(Donnees.java:20)
    at traitementCSV.TraitementDateDonneesLibelle.lambda$0(TraitementDateDonneesLibelle.java)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.stream.SliceOps$1$1.accept(Unknown Source)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.collect(Unknown Source)
    at traitementCSV.TraitementDateDonneesLibelle.main(TraitementDateDonneesLibelle.java:52)
    Un bout de mon CSV d'entrée:
    idIndex,date,heure,participant,adresseParticipant,equipement,adresseBus,valeur
    1,06-03-17,11:39:59,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_Chambre,5/1/3,00
    2,06-03-17,11:39:59,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_SDB,5/1/4,00
    3,06-03-17,11:40:01,Indefini,1.1.103,Consommation_Energie_General,4/0/0,003C
    4,06-03-17,11:40:01,Capteur_IR_Exterieur,1.1.31,Luminosite_Exterieure,5/1/0,26
    5,06-03-17,11:40:09,Capteur_Hall,1.1.30,Luminosite_Hall_Entree,5/1/1,14
    6,06-03-17,11:40:12,Capteur_Zenio_Chambre_SDB,1.1.39,Temperature_Salon,5/4/0,07
    7,06-03-17,11:40:14,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_Chambre,5/1/3,00
    8,06-03-17,11:40:14,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_SDB,5/1/4,00
    9,06-03-17,11:40:18,Capteur_Theben,1.1.32,Luminosite_Salon,5/1/2,00
    10,06-03-17,11:40:21,Capteur_IR_Exterieur,1.1.31,Luminosite_Exterieure,5/1/0,27
    11,06-03-17,11:40:22,Capteur_Zenio_Chambre_SDB,1.1.39,Temperature_Salon,5/4/0,07
    12,07-03-17,11:40:23,Indefini,1.1.103,Consommation_Puissance_General,4/1/0,42F6
    13,06-03-17,11:40:28,Capteur_IR_Exterieur,1.1.31,Luminosite_Exterieure,5/1/0,27
    14,06-03-17,11:40:29,Capteur_Zenio_Chambre_SDB,1.1.39,Luminosite_Chambre,5/1/3,00
    Ma classe 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
     
    package traitementCSV;
     
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.util.*;
    import java.util.stream.Collectors;
     
    import javax.xml.crypto.Data;
     
    import com.opencsv.*;
     
    public class TraitementDateDonneesLibelle {
     
    	public static void main(String[] args) throws FileNotFoundException, IOException{
     
    		String chemin = "Chemin_vers_fichier/test.csv";
    		File fichierCSV = new File(chemin);
    		PrintStream out = System.out; // pour l'exemple, se remplace facilement par un PrintStream sur un fichier
     
    		//File file  = ton fichier csv
     
    		// 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
    			        .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
     
    			       //PrintStream out = null;
    				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("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
     
     
    		}
    		//catch (NumberFormatException e){
    		       //System.out.println("not a number"); 
     
    		  // } 		 
    		}	
    	}
    Maclasse Donnees:
    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;
    	}
    }
    Merci d'avance.

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    J'ai supposé au vu de l'extrait de CSV que tu montrais que la première colonne était du type int (un nombre entier).

    L'exception se passe sur cette ligne this.id = Integer.parseInt(data[0]); : elle dit que data[0] ne peut être converti en int, parce que ça ne contient pas du int(peut-être que c'est vide, peut-être que ça contient autre chose que des chiffres...). A la limite, comme ça ne te sert à rien dans ton traitement, tu peux déclarer id en String et faire simplemnt this.id = data[0];

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je te remercie, j'avais fini par trouver comment solutionner ce pb au vu du message d'erreur.
    Par contre j'ai un pb, qui je crois est en rapport avec l'indexation de mon Array. Là, je ne vois pas ce qui peut en être la cause.

    Message d'erreur :

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at traitementCSV.Donnees.<init>(Donnees.java:21)
    at traitementCSV.TraitementDateDonneesLibelle.lambda$0(TraitementDateDonneesLibelle.java)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.stream.SliceOps$1$1.accept(Unknown Source)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.collect(Unknown Source)
    at traitementCSV.TraitementDateDonneesLibelle.main(TraitementDateDonneesLibelle.java:36)
    Merci d'avance.

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le message dit qu'on essaye d'accèder à l'index 1 d'une ligne qui n'en compte pas autant.

    A voir si c'est normal ou pas d'avoir des lignes qui n'ont que un élément. Si c'est pas normal, il faut corriger à la source (Garbage In Garbage Out, donc si on ne veut pas Garbage Out, on ne doit pas avoir Garbage In). Si c'est normal, le plus simple est de filtrer ces lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Map<LocalDate, Map<String, Integer>> map = myEntries.stream() // on parcourt la liste de String[] par stream
            .skip(1) // on passe la ligne de titres
            .filter(line-> /*condition ici sur line, un String[], donc par exemple line.length>=8*/)
    	.map(Data::new) // on transforme chaque ligne en instance de Data
            /*etc*/
    Si tu veux une trace des lignes qui n'ont pas assez de colonnes, tu peux faire :

    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
            .peek(line-> {
                    if ( line.length<8 ) System.out.println("Pas assez de données dans la ligne " + Arrays.toString(line));
                   })
            .filter(line-> /*condition ici sur line, un String[], donc par exemple line.length>=8*/)
    	.map(Data::new) // on transforme chaque ligne en instance de Data
            /*etc*/

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Je te remercie encore.
    Je viens de trouver où se situait mon pb. Absolument pas au niveau de ton code mais de mon CSV qui contenait des sauts de lignes, forcément.
    Je suis sur la bonne voie.

    Mon dernier pb est de pouvoir écrire tout ça dans un fichier CSV.

    En tous cas, merci beaucoup à toi Joel.Drigo

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    Bon ! je "dé"résous ce topic.
    Je suis maintenant confronté à un autre pb, celui du filtrage des données en fonction des familles d'équipements domotiques.
    Actuellement, je récupère l'intégralité des équipements mais je souhaiterai par exemple pouvoir n'afficher que ce qui concerne les portes, les fenêtres, les volets... via un menu déroulant comme dans l'illustration ci-dessous.
    Si quelqu'un entend mon appel au secours.

    Merci d'avance.

    Nom : interface Klog test.jpg
Affichages : 355
Taille : 235,5 Ko

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Cette nouvelle question a-t-elle un rapport avec le traitement du fichier CSV, la question initiale ?

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,
    A mon sens oui, puisque je souhaite grouper en fonction de familles d'équipements à partir du fichier CSV (si possible), telles que portes, fenêtres ... En effectuant une sélection des ces dernières à partir d'un menu déroulant. Comme sur la photo, je choisi un type de graphique, puis un type d'équipement.
    Mais si tu préfères, je peux ouvrir un nouveau sujet.

    Merci.

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Mais la question porte sur le filtrage des données dans le CSV, ou sur l'aspect graphique (comment afficher un dialogue, avec une combo, la remplir avec les bonnes données, tout ça), auquel cas, un autre sujet serait en effet préférable ?

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    En fait j'ai un csv comme celui ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    date,Consommation_Energie_General,Consommation_Energie_Plaques,Consommation_Energie_Prises_Cuisines,Consommation_Puissance_General,Consommation_Puissance_Plaques,Consommation_Puissance_Prises_Cuisines,Eclairage_Entree_Centre,Etat_Eclairage_Entree_Centre,Etat_Ouverture_Porte_Entree_Salon,Indefini,Luminosite_Chambre,Luminosite_Exterieure,Luminosite_Hall_Entree,Luminosite_SDB,Luminosite_Salon,Ouverture_Porte_Entree_Salon,Ouverture_Reelle_Porte_Appartement,Ouverture_Reelle_Porte_Entree_Exterieure,Ouverture_Reelle_Porte_Studio,Presence_Salon,Temperature_Chambre,Temperature_Salon
    2017-03-08,17,13,15,22,8,8,4,4,2,4,141,34,67,140,70,2,2,4,2,12,34,42
    2017-03-09,70,16,30,1,38,90,7,23,70,0,91,1,1,24,0,45,14,56,0,90,34,100
    2017-03-10,20,56,73,10,91,82,50,0,59,3,18,0,3,19,11,67,2,92,106,62,1,80
    2017-03-11,71,19,67,42,10,90,20,81,101,49,1,28,13,61,19,70,49,20,83,100,40,37
    Et je souhaiterai n'afficher, par exemple, que les données concernant "Consommation_Energie_Plaques" dans mon graph, cela via un menu déroulant.
    Il s'agit plutôt d'un filtrage, que d'un groupement de données CSV, à proprement parler.

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et bien, si on reprend l'exemple que je t'ai déjà donné, on peut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Data> 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
    Puis, pour obtenir la liste des équipements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<String> equipements = data.stream()
                                   .map(Data::getEquipement) // on récupère la propriété equipement
                                   .distinct() // on supprime les doublons
                                   .sorted() // pour trier 
                                   .collect(Collectors.toList()); // on transforme en liste
    et pour filtrer, obtenir la liste des Data tel que l'équipement soit la valeur de la variable equipement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<Data> dataEquipement = data.stream()
                                    .filter(ligne-> Objects.equals(ligne.getEquipement(), equipement))
                                    .collect(Collectors.toList()); // on transforme en liste

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Merci de ta réponse.
    Ce code va me générer un autre csv, je ne vois pas comment lier ce code à mon menu déroulant.
    Désolé pour mon ignorance

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Aucun des trois extraits de code ne génère aucun CSV. Juste des List !

    Pour créer une combo (pas un menu déroulant, trop compliqué pour faire ce que tu veux), en Swing par exemple (je ne sais pas quelle bibliothèque graphique tu veux utiliser, ni même si c'est du desktop ou du web...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JComBox<String> equipementCombo = new JComboBox<>(data.stream()
                                   .map(Data::getEquipement) // on récupère la propriété equipement
                                   .distinct() // on supprime les doublons
                                   .sorted() // pour trier 
                                   .toArray(String[]::new)); // pour transformer en tableau
    );

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    c'est une appli web.
    Tu suggères que je génère ma liste en java (Swing) plutôt qu'en HTML et javaScript ?
    Comment faire en sorte que JComboBox interagisse avec mes graphiques ?
    Je ne vois pas du tout comment cela peut fonctionner, ni a quoi ça ressemblerait.

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gadje Voir le message
    c'est une appli web.
    Ça, je ne peux pas le deviner.
    Citation Envoyé par gadje Voir le message
    c'est une appli web.
    Tu suggères que je génère ma liste en java (Swing) plutôt qu'en HTML et javaScript ?
    Comment faire en sorte que JComboBox interagisse avec mes graphiques ?
    Je ne vois pas du tout comment cela peut fonctionner, ni a quoi ça ressemblerait.[/QUOTE]
    Ça, forcéement, Swing, ça ne peut pas marcher en Web. Il faut que tu génères une page html (via jsp ou servlet) dans laquel tu vas la liste d'options. Par stream, il suffit d'utilser par exemple forEach() avec une lambda qui va écrire dans le out de la jsp par exemple, les options de la liste, comme si tu ferais à la main. Tout le reste concerne le client (afficher une liste de choix, afficher des courbes, réagir à une sélection, etc). mais ce n'est plus du tout du Java (en Java, dans la JSP ou la Servlet on ne fait que générer automatiquement le flux texte html (ou autre) qui va être interprété par le navigateur pour faire le rendu de la page : c'est ni plus ni moins que d'écrire automatiquement les caractères qu'on taperait à la main si on le faisait à la main).
    Il vaudrait mieux que tu créés un nouveau sujet dans la section web.

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 36
    Points
    36
    Par défaut
    Ok, je vais suivre ton conseil et ouvrir un autre sujet. En tous cas, je te remercie grandement de ton aide.
    Bon WE.

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

Discussions similaires

  1. [Toutes versions] Croiser des données avec comme synthèse des données alphanumériques
    Par Philippe Tulliez dans le forum Contribuez
    Réponses: 0
    Dernier message: 19/02/2014, 08h48
  2. affichage dynamique en fonction des données en base
    Par jengo dans le forum Bases de données
    Réponses: 1
    Dernier message: 28/10/2004, 10h22
  3. Ajusté les Axes d'un graphe en fonction des données rentrée!
    Par Ma2thieu dans le forum Composants VCL
    Réponses: 5
    Dernier message: 09/07/2004, 01h34
  4. [CR] mise en forme d'un champs texte en fonction des données
    Par niPrM dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 29/06/2004, 11h57
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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