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

Entrée/Sortie Java Discussion :

Supprimer une ligne dans un fichier csv en lecture


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Points : 21
    Points
    21
    Par défaut Supprimer une ligne dans un fichier csv en lecture
    Bonjour,

    J'aimerai savoir s'il est possible de supprimer une ligne dans un fichier si cette ligne ne correspond pas à une condition.

    En fait je crée une fonction qui valide la bonne structure de chaque colonne de chaque ligne d'un fichier.
    Si une colonne d'une ligne ne correspond pas à ma condition, je souhaite supprimer ou ignorer la ligne complète pour la suite du traitement.

    J'ai lu qu'une telle méthode n'existait pas et qu'il fallait donc la créer soit même. Est-ce vrai ? Est-ce qu'il n'y a pas une class qui le permette?

    Si je dois coder cela est-ce que vous avez une méthode "propre" pour pouvoir arriver à ce dont j'ai besoin ?

    Voici mon code actuel:
    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
     
         protected void validateFileStructure(File file) throws IOException 
        {
     
                LineIterator lineIterator = FileUtils.lineIterator(file);
                Set<String> idndocs = new HashSet<String>();
                int i= 0;
                int j=0;//compteur
     
                LineNumberReader lnr=new LineNumberReader(new FileReader(file));
                try{
                     String ligneLue;
                    //creation du flux
     
                     try{
                         List<String> tabCodeCaisse=Arrays.asList(new String[]{"16275","18025","15135","13135","18715","14445","14505","43199","13335","17515","12579",
                                        "11425","11315","13485","18315","12135","13825","14265","16705","12128","19019"});
     
                         List<String> tabCodeTypeAttr=Arrays.asList(new String[]{"1","2","3","4","5","6","7","8","9","10","11"}); 
     
                         while((ligneLue=lnr.readLine())!=null)//parcours des lignes
                            {    String[] tabLigneLue=ligneLue.split(";");//split la ligne lue
     
                          if (tabLigneLue.length>0)
                            {
                                String codeCaisse=tabLigneLue[0];
                                if(tabCodeCaisse.contains(codeCaisse))
                                {
                                    String CodeTpeAttr=tabLigneLue[1];
                                    if(tabCodeTypeAttr.contains(CodeTpeAttr))
                                        LOG.info("");
                                    else
                                        {LOG.info("Code type attributaire "+ CodeTpeAttr+ " non valide. Vérifier la saisie");
     
                                      //J AIMERAI SUPPRIMER OU IGNORER LA LIGNE ICI
                                       // IDEALEMENT: ligneLue.delete()}
                                }
                                else
                                    LOG.info("Code Caisse "+ codeCaisse + " inexistant." + " Verifiez la saisie.");
                            }
     
                              }//fin du while
                         }//fin du try
                    finally
                        { 
                            lnr.close();//libération des ressources**/
     
                        }
     
                } catch (IOException ioe) {
                 // erreur de fermeture des flux
                    System.out.println("Erreur --" + ioe.toString());
                    }
     
     
         }
    Merci pour vos retours

  2. #2
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Il n'est effectivement pas possible de supprimer directement la ligne.

    Après ce n'est pas très dur à coder.

    La meilleure solution dans ton cas serai dans un premier temps de créer une liste avec les lignes que tu souhaites garder, puis à fin, réécrire cette liste dans ton fichier. Cela écrasera le contenue précédent. Tu peux aussi créer un autre fichier si tu souhaites garder l'ancien.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Points : 21
    Points
    21
    Par défaut
    D'accord merci pour ta réponse, je vais essayer de code ça alors.
    J'espère pouvoir mettre un "RESOLU" d'ici demain matin

  4. #4
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Suite à tes conseils, je suis entrain de mettre en place ton idée.
    J'ai donc créer une liste dans laquelle j'ajoute à chaque fois la ligne si la ligne traitée correspond à mes conditions.
    Par contre, dans Finally, je souhaite donc copier dans le fichier tout ce que contient la list. Mais là je bloque. Comment écrire dans le fichier le contenu de la liste ??
    Ci-dessous mon code actuel.
    Merci pour ton/vos retours !
    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
     
     protected void validateFileStructure(File file) throws IOException 
        {
     
                LineIterator lineIterator = FileUtils.lineIterator(file);
                Set<String> idndocs = new HashSet<String>();
                int i= 0;
                int j=0;//compteur
     
                /********************************************************************************
                 * Vérification du code caisse existant:
                     * codeCaisse saisie en 1ère colonne du fichier de saisie 
                   Vérification du code type attributaire
                 * *******************************************************************************/
                LineNumberReader lnr=new LineNumberReader(new FileReader(file));
                try{
                     String ligneLue;
                     List<String> ListLigne=Arrays.asList(null);
     
                     try{
                         List<String> tabCodeCaisse=Arrays.asList(new String[]{"16275","18025","15135","13135","18715","14445","14505","43199","13335","17515","12579",
                                        "11425","11315","13485","18315","12135","13825","14265","16705","12128","19019"});
     
                         List<String> tabCodeTypeAttr=Arrays.asList(new String[]{"1","2","3","4","5","6","7","8","9","10","11"}); 
     
     
                         while((ligneLue=lnr.readLine())!=null)//parcours des lignes
                            {    String[] tabLigneLue=ligneLue.split(";");//split la ligne lue
     
                          if (tabLigneLue.length>0)
                            {
                                String codeCaisse=tabLigneLue[0];
                                if(tabCodeCaisse.contains(codeCaisse))
                                {
                                    String CodeTpeAttr=tabLigneLue[1];
                                    if(tabCodeTypeAttr.contains(CodeTpeAttr))
                                        {
                                        ListLigne.add(ligneLue);//écriture de la ligne valide dans la liste
                                        }
                                    else
                                        LOG.info("Code type attributaire "+ CodeTpeAttr+ " non valide. Vérifier la saisie");
                                }
                                else
                                    LOG.info("Code Caisse "+ codeCaisse + " inexistant." + " Verifiez la saisie.");
     
                            }
     
                              }//fin du while
                         }//fin du try
                    finally
                        {   //écriture du contenu de la list dans le fichier 
                            FileWriter FicTrie= new FileWriter(file.getName(),true);//  création d'un flux de caractère en écriture: va écraser les données présentes
                            JE BLOQUE ICI // écriture de la liste dans le fichier
                            FicTrie.close();//libération des ressources
                            lnr.close();//libération des ressources 
     
     
                          }
     
                } catch (IOException ioe) {
                 // erreur de fermeture des flux
                    System.out.println("Erreur --" + ioe.toString());
                    }    		
         }

  5. #5
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FileWriter fw = new FileWriter(file.getName(),true);
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter fichierSortie = new PrintWriter(bw);
    for (int i = 0; i < taliste.size(); i++) {
         fichierSortie.println(taliste.get(i).trim());
    }
    fichierSortie.close();
    bw.close();
    fw.close();
    (javais fait avec un ArrayList)

  6. #6
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Déjà il ne surtout faut pas faire ce traitement dans le finally. Imagine qu'il y ai un problème pendant le traitement et que cela te renvoi une erreur, dans ton cas tu vas écraser ton fichier d'origine avec une liste tronqué.

    Tu dois donc écrire après ta boucle de traitement (éventuellement faire appel à une fonction dédiée pour plus de lisibilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<String> ListLigne=Arrays.asList(null);
    A bannir définitivement. Il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<String> ListLigne = new List<String>();
    Sinon pour écrire dans ton fichier.

    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
     
    final String chemin = "{tonPath}/tmp.txt";   
    final File fichier = new File(chemin); 
    try {
    	// creation d'un writer (un écrivain)
    	final FileWriter writer = new FileWriter(fichier);
    	try {
    		for(Iterator<String> iter = listLigne.iterator();iter.hasNext())
    			writer.write(iter.next());
    		writer.flush();
    	} finally {
    		// quoiqu'il arrive, on ferme le fichier
    		writer.close();
    	}
    } catch (Exception e) {
    	System.out.println("Problème lors de l'écriture dans le fichier");
    }

  7. #7
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Points : 21
    Points
    21
    Par défaut
    Oui, j'ai supprimé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<String> ListLigne=Arrays.asList(null);
    Cela me générait un NullPointerException.

    Du coup, merci mon fichier est bien écrasé par les lignes que je souhaite garder.
    Par contre, il ajoute les lignes les unes à la suite des autres:
    Mon fichier est un .csv (15 colonnes quand on l'ouvre avec Excel). Dans mon cas de test j'ai 12 lignes qui sont valides sur 79. Il conserve donc bien ces 12 lignes mais il met 12 fois les 15 colonnes les unes à la suite des autres.
    Pour qu'il fasse bien la différence entre les différentes lignes, est-ce que je dois traiter ça directement dans la liste ? Si oui, comment? On ne peut pas rajouter de retour charriot dans une liste...

    Je vais réfléchir à ça pour cet après-midi en tout cas...

  8. #8
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Rajoute le quand tu écris dans ton fichier;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.write(iter.next()+"\n");
    EDIT: D’ailleurs il est préférable de l'écrire comme suis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private final String LINE_SEPARATOR = System.getProperty("line.separator" ); // A mettre avec la déclaration de variable au debut
     
    writer.write(iter.next() + LINE_SEPARATOR );

  9. #9
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Points : 21
    Points
    21
    Par défaut
    SUPER
    Ca fonctionne exactement comme je le voulais. Merci beaucoup pour ton aide. Je débute en Java et j'apprends énormément, je suis super contente d'avancer.

    Merci encore

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

Discussions similaires

  1. Supprimer une ligne dans un fichier texte
    Par @yoyo dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 28/03/2006, 14h19
  2. Supprime une ligne dans un fichier texte
    Par dev7 dans le forum Linux
    Réponses: 4
    Dernier message: 28/03/2006, 01h33
  3. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 16h43
  4. Supprimer une ligne dans un fichier
    Par tsing dans le forum Linux
    Réponses: 4
    Dernier message: 06/02/2006, 14h45
  5. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

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