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

Java Discussion :

[JAVA 1.4] Supprimer caractère dans fichier


Sujet :

Java

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut [JAVA 1.4] Supprimer caractère dans fichier
    Hello les gens,
    J'aurais besoin de modifier un fichier csv pour y supprimer toutes les occurences du separateur ";"
    J'aimerai autant que possible éviter de réinventer la roue s'il ya une api pour faire cela.
    Merci pour toutes vos contribution.

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 621
    Points : 15 704
    Points
    15 704
    Par défaut
    En tout cas il n'y a rien de tel dans l'API Java standard, ni dans les bibliothèques que je connais.

    Je pense n'échapperas pas à une lecture du fichier et réécriture dans un autre en ignorant les ";".

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    En shell script il y a sed. C'est pas du Java, mais c'est fait pour ça et ça évite de réinventer la roue.

    En pratique ce n'est qu'une simple question de remplacement de regex (même moins que ça, en fait,) mais en Java je ne connais pas de bibliothèque pour faire ça sur un fichier.

    Un truc que tu peux faire, c'est juste ouvrir un BufferedInputStream de ton fichier, lire les octets les uns après les autres, et réécrire dans un OutputStream d'un autre fichier, tout ce qui n'est pas égal à ';'
    Puis effacer le fichier qui vient d'être lu, et renommer le fichier qui vient d'être écrit à sa place.
    (Cette méthode ne marche que si l'encodage du fichier est un charset étendant l'ASCII mono-octet. Dans le cas contraire, il vaut mieux travailler sur un BufferedReader.)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    A ma connaissance il n'y a pas une API java pour ton besoin.
    Si tu peux juste remplacer le caractère ';' par un ' ' (espace) ou un caractère non imprimable alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1-sauvegarder la position de ta lecture avec RandomAccessFile#getFilePointer()
    2-Lire ton fichier par morceau avec read(byte[BUF_SIZE])
    3-Remplacer les ';' par ' ' 
    4- Ecrire ton buffer à la position sauvegardée
    5- Revenir à l'étape 1 tant que non EOF.
    NB:Comme l'a mentionné thelevin cette méthode n'est valable que si ton fichier utilise un encodage sur 8bits (ASCII, ISO latin 1...)
    A++

  5. #5
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    hmm... l'objet RandomAccessFile possède une méthode seek et mon fichier est constitué de champs de longueurs fixes, je pense pouvoir me débrouiller avec ??!?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    - Je ne vois pas le rapport avec seek().

    - utiliser un RandomAccessFile permet de modifier un fichier en lecture/écriture au lieu de lecture seule ou écriture seule, ce qui peut paraître bien... Mais là ce que tu veux c'est enlever des octets. À chaque fois que tu vas enlever un octet, tous les octets suivants vont devoir être décalés d'un vers la gauche.
    De nos jours les OSs sont des supermans et gèrent ça très bien, mais ça reste extrêmement inefficace.

  7. #7
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    je pensais à quelque chose dans ces eaux là:
    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
    RandomAccessFile raf = null;
    try {
    	raf = new RandomAccessFile(XIMPORTFilePath, "rw");
    	String ligne;
    	while ((ligne = raf.readLine()) != null) {
    	//les ";" se situent toujours aux position '7' '24' et '222' par exemple
    	raf.seek(7);
    	raf.writeChars("");
    	raf.seek(24);
    	raf.writeChars("");
    	raf.seek(222);
    	raf.writeChars("");
    	//Comment passer à la ligne suivante ?
    	}
     
    } catch (Exception e6) {
    	// TODO Bloc catch auto-généré
    	e6.printStackTrace();
    } finally {
    	raf.close();
    }

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Moi j'aurai fait un truc qui ressemble a ça:

    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
     
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
     
    public class Toto {
    	// String oldpattern = ";";
    	// String replPattern = "";
    	public void readReplace(String fileName, String oldpattern, String replPattern){
    		String line;
    		StringBuffer sb = new StringBuffer();
    		try {
    			FileInputStream fis = new FileInputStream(fileName);
    			BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
    			while ((line = reader.readLine()) != null) {
     
    				line = line.replaceAll(oldpattern, replPattern);
    				sb.append(line + "\n");
     
    			}
    			reader.close();
    			BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
    			out.write(sb.toString());
    			out.close();
    		}
    		catch (Throwable e) {
    			System.err.println("------------ exception" + e);
    		}
    	}
    }
    a tester et corriger si nécessaire

  9. #9
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Ton code marche bien ctrl33, je remplacerai juste qui n'est pas portable par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.getProperty("line.separator")

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    C'est pas faux

  11. #11
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Attention, Excel différencie le "\n" (saut de ligne dans une valeur) de "\r\n" (nouvelle ligne de données)

  12. #12
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Ce fichier n'est pas destiné à excel mais plutôt à Ciel. De ce fait, oui, il pourrait y avoir un problème. Ciel tourne sur un serveur windows et pourrait ne pas accepter le fichier généré avec des retours chariot type "\n" puisque généré sur une machine tournant sur unix.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Oui donc comme d'hab, il ne faut pas utiliser System.getProperty("line.separator").

    Il faut utiliser la bonne convention de fin de ligne. Dans le cas présent, appremment "\r\n".

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

Discussions similaires

  1. Comment trouver une chaine de caractère dans fichier texte
    Par youssef1989 dans le forum Débuter
    Réponses: 3
    Dernier message: 01/05/2008, 16h45
  2. [Borland 6] Supprimer caractère dans fichier
    Par grmi91 dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/04/2007, 16h18
  3. Supprimer lignes dans fichier texte
    Par dr_octopus74 dans le forum VBScript
    Réponses: 1
    Dernier message: 20/02/2007, 17h54
  4. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 11h55
  5. chaines de caractères dans fichier .rc ou .res
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/03/2004, 15h19

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