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

Langage Java Discussion :

Lire fichier CSV puis traitement


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut Lire fichier CSV puis traitement
    Bonjour,

    J'aimerais lire en entrée plusieurs fichiers CSV, puis pour chaque ligne crée une HashMap (ou mieux si vous pensez à autre chose), avec en clé la première ligne et en valeur les données de chaque ligne.

    Pour le moment j'ai ce code la mais il ne fonctionne pas très bien...

    PS : j'ai des valeurs vide dans le 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
    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
    public class Ligne implements FilenameFilter{
     
    	public static void parseCSV(String filePath)throws IOException{
    		try{
    			FileReader fr = new FileReader(filePath);
    			// passe par un buffer pour simplifier la lecture du fichier
    			BufferedReader buf = new BufferedReader(fr);
    			// déclaration d'une chaîne de caractères afin de stocker la chaîne courante à chaque tour dans la boucle.
    			String ligneUne;
    			String ligne;
    			HashMap<String, String> map = new HashMap<String, String>();
    			//on lit la première ligne du fichier
    			ligneUne = buf.readLine();
    			ligne = buf.readLine();
    			// tant qu'il y a des lignes à lire (ligne != null)
    			String[] titre = ligneUne.split(";");
    			for (int j = 0 ; j < titre.length ; j++){
    				ligne = buf.readLine();
    				//while (ligne != null) {
    					// On découpe (split) la ligne à l'aide du séparateur 
    					//les données sont stockées dans un tableau de 
    					//chaine de caractètes
    					String[] tabChaine = ligne.split(";");
    					//on affiche les données en parcourant le tableau
    					for (int i = 0 ; i < tabChaine.length ; i++){
    						//on lit la ligne suivante
    						ligne = buf.readLine();
    						map.put(titre[i], tabChaine[i]);
    						System.out.println("Clé : " + map.keySet() + " Valeur : " + map.values());
    					}
    				//}
    			}
    			fr.close();
    		}
    		catch (FileNotFoundException e){
    			System.out.println("Le fichier est introuvable !");
    		}
    		catch (IOException e) {
    			System.out.println( e );
    		}
    	}
     
    	public boolean accept(File file, String name) {
    		return name.toLowerCase().endsWith(".csv");
    	}
     
    	public static void main(String args[]) throws IOException {
    		File root = new File("./input");
    		File[] files = root.listFiles(new CSVFilter());
     
    		for (File f : files) {
    			String fileName = f.toString();
    			parseCSV(fileName);
    		}
     
    	}

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    J'ai compris que tu voulais créer pour chaque ligne d'une série de fichiers CSV une HashMap, donc il te faut au final un tableau de HashMaps afin de référencer toutes les lignes.
    Partant de cette Hypothèse, j'ai légèrement modifié ton programme. J'ai commenté dans le code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    import java.util.*;
    import java.io.*;
     
    public class Ligne implements FilenameFilter{
     
    	public static void parseCSV(String filePath)throws IOException{
    		try{
    			FileReader fr = new FileReader(filePath);
    			BufferedReader buf = new BufferedReader(fr);
    			String ligneUne;
    			String ligne;
    			ArrayList<HashMap<String, String>> map = new ArrayList<HashMap<String, String>>();//tableau de HashMap car 1 hashMap par ligne
    			HashMap<String, String> temp = new HashMap<String, String>();
    			ligneUne = buf.readLine();					//lecture de la premiere ligne pour le titre
    			String[] titre = ligneUne.split(";");				//on split et on met dans titre[]
    			String[] tabChaine;						//
    			ligne = buf.readLine();						//lecture de la  ligne suivante
    			while (ligne != null) {						//tant qu'il y a des lignes.......
    				tabChaine = ligne.split(";");				//je split la ligne
    				temp = new HashMap<String, String>();			//je cree un hashMap temporaire
    				for (int i = 0 ; i < tabChaine.length ; i++){		//
    					temp.put(titre[i],tabChaine[i]);		//je remplis le hasmap temp avec key =  titre[] et valeurs = tabChaine[]
    				}							//
    				map.add(temp);						//quand la ligne est terminée j'ajoute mon HashMap au tableau de hashMap
    				ligne = buf.readLine();					//je lis la ligne suivante
    			}	
    			fr.close();
    			for (int i=0; i < map.size();i++) {				//pour tous les hashMap de mon tableau de hashMap
    				Iterator ite = map.get(i).keySet().iterator();		//
    				System.out.println("Ligne " + i );			//j'ecris le numero de la ligne recuperee
    				while(ite.hasNext()) {					//et je detaille tous les elemnts du hashMap a l'aide de iterator()
    					String key = (String)ite.next();		//
    					System.out.println("clé: " + key + "     Valeur: " + (String)map.get(i).get(key));//
    				}
    			}
     
    		}
    		catch (FileNotFoundException e){
    			System.out.println("Le fichier est introuvable !");
    		}
    		catch (IOException e) {
    			System.out.println( e );
    		}
    	}
     
    	public boolean accept(File file, String name) {
    		return name.toLowerCase().endsWith(".csv");
    	}
     
    	public static void main(String args[]) throws IOException {
    		File root = new File("./input");
    		File[] files = root.listFiles();
     
    		for (File f : files) {
    			String fileName = f.toString();
    			parseCSV(fileName);
    		}
     
    	}
    }

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    Merci pour ton aide, pense tu qu'il soit possible d'avoir la map trié dans l'ordre de mes colonnes du fichier CSV ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Peut être a l'aide d'une SortedMap ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Peut être a l'aide d'une SortedMap ?
    Ça ne va pas me la trier par ordre alphabétique.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Avec un code comme ça :

    J'espère que tu n'as pas un point virgule qui peut être contenu dans une cellule...

    Je te conseil de lire les fichiers CSV avec la librairie opencsv. Tu peux lire ce tuto si tu veux.

    Romain.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/09/2009, 22h43
  2. Lire fichier CSV avec tabulation comme séparation
    Par theNoob dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2009, 18h52
  3. Charger un Fichier CSV avec traitement
    Par Iphelias dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 06/08/2007, 13h53
  4. lire fichier csv
    Par nico0812 dans le forum C#
    Réponses: 4
    Dernier message: 17/04/2007, 18h40
  5. lire fichier csv et en extraire des infos
    Par isaglada dans le forum VBScript
    Réponses: 2
    Dernier message: 12/02/2007, 13h04

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