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

C# Discussion :

Optimisation : remplacement dans un fichier


Sujet :

C#

  1. #1
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut Optimisation : remplacement dans un fichier
    Salut,

    je cherche à virer un caractère dans un fichier contenant de nombreuses lignes. (en fait je veux virer les guillemets d'un fichier csv)

    Mise à part ouvrir le fichier ligne par ligne et faire un String.Replace(), quel serait le moyen le plus adéquat (et performant) ?

    Ouvrir le fichier en hexa ? Lire un stream sans s'occuper du format du fichier ? ...


  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Alors moi je dirais que y'a pas de moyen meilleur qu'un autre.

    Dans tous les cas tu aura un accès sequentiel et une modification une à une.

    Après peut-être que lire le fichier ligne par ligne, supprimer les " et recopier dans un nouveau fichier est moins couteux, puisque à chaque fois tu ne dois pas tout décaler dans ton fichier.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    J'étais parti sur un stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                    StreamReader read = new StreamReader(File.OpenRead(FicApplis));
                    string data = read.ReadToEnd();
                    read.Close();
     
                    data = data.Replace("\"", string.Empty);
     
                    StreamWriter write = new StreamWriter(FicApplis, false);
                    write.Write(data);
                    write.Flush();
                    write.Close();
    mais je risque peut-être de tout exploser si le fichier est trop grop, vu que je le charge en entier dans le string data ? (je peux le découper en quelques morceaux)

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    un string ne peut pas exploser je pense

    sinon la classe system.text.stringbuilder est un genre de string amélioré et beaucoup plus performant (pas pareil à utiliser, append permet de rajouter des caractères, tostring te retourne la valeur as string)
    son replace est ptete mieux ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    OK, je regarderai ça demain.

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je pense qu'il faudrait mieux lire ligne par ligne (ou morceau de taille fixe par morceau de taille fixse) si le fichier peut avoir une taille qui dépasse les quelques dizaines de Mo (car là, ton programme va le sentir le string ...), par contre si tes fichiers ne dépassent jamais 5 Mo ce n'est même pas nécéssaire ...

  7. #7
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    Fichiers de 1 à 2 Mo à priori.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    avec regexp on ne peut pas traiter tout un fichier d'un coup ?

  9. #9
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Cela serait possible effectivement avec les expressions régulières. A la va vite, cela donnerait quelque chose comme ça je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string str = "truc;super;toto;machin";
    str += Environment.NewLine + "\"1\";\"super chouette\";\"ptdr\";quoi ?";
    str += Environment.NewLine + "\"2\";\"trop cool\";\"rofl\";comment ?";            
     
    // On supprime les guillemets qui encadrent les valeurs
    string s1 = Regex.Replace(str, "\"(.*?)\"", "$1");
    Mais pour ce qui est de tout traiter d'un coup, suivant la longueur de la chaîne, ce n'est peut être pas aussi performant qu'une lecture séquentielle, à tester.

    Par contre après il faut aussi gérer les guillemets doublés (lorsqu'il y a un guillemet dans la valeur) et c'est peut être plus simple à faire avec une expression régulière qu'avec un remplacement par la méthode string.Replace.
    Pas de questions techniques par MP

  10. #10
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    Les regex intuitivement je me dis que c'est moins rapide, vu que le programme va devoir faire de multiples opérations de recherche/comparaison de sous-chaînes, alors qu'en lecture séquentielle il suffit de lire et comparer chaque caractère 1 fois.

    Et ouvrir le fichier en binaire (plutôt qu'en texte) ça apporterait quelquechose ? Toujours intuitivement je me dis que ça irait plus vite.

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Pas forcément ... en l'ouvrant en binaire, comment tu remplaces la chaine ?

  12. #12
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par smyley Voir le message
    Pas forcément ... en l'ouvrant en binaire, comment tu remplaces la chaine ?
    C'est juste un caractère que je veux remplacer, je peux alors rechercher la valeur binaire de ce caractère, non ? (en fait je dis ça mais je sais même pas à quoi ça ressemble un fichier ouvert en binaire )

  13. #13
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Le truc c'est qu'il faudra que tu lises byte par byte en espérant que le caractère que tu veux remplacer tient sur un byte. Si ce n'est pas le cas (vive l'Unicode) tu sera encore plus mis à mal. Ensuite, la lecture byte par byte en .NET est d'une lenteur affreuse et pour avoir une vitesse équivalente à la lecture ligne par ligne en mode "texte", il faudrait utiliser un buffer de lecture pour stoquer quelques milliers de bytes à l'avance pour éviter au maximum d'accéder au flux ... Et là ça commence à faire la méthode du bazooka ...

  14. #14
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    C'est noté.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  2. programme qui plante. chercher/remplacer dans des fichiers.
    Par [Hugo] dans le forum Général Python
    Réponses: 2
    Dernier message: 31/10/2006, 17h10
  3. remplacement dans un fichier texte
    Par ciberju dans le forum C
    Réponses: 5
    Dernier message: 25/08/2006, 09h36
  4. Afficher, rechercher et remplacer dans un fichier
    Par lynal dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2006, 21h24
  5. Remplacement dans un fichier .txt
    Par sebtoto62 dans le forum Langage
    Réponses: 4
    Dernier message: 28/07/2005, 13h15

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