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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gadje
    Homme Profil pro
    Développeur SI
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Par défaut [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
    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;
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Par défaut
    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
    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];
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

    Informations professionnelles :
    Activité : Développeur SI

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Par défaut
    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
    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*/
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [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