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 :

Modification fichier Texte


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut Modification fichier Texte
    Bonjour
    J'ai une liste de fichier texte (des centaines de fichier);
    Je voudrai faire un programme qui lit les fichier un à un et modifier certains information dans tous les lignes. Donc:
    1.Je crée un fichier tmp pour chaque fichier existant.
    2. je lit chaque fichier ligne à ligne je modifier et j'écris dans le fichier tmp.
    3. je supprime le fichier existant.
    4. Je renomme le fichier tmp.
    ma question est ce que c'est le bon algorithme car l'exécution c'est long. est ce que il y a d'autre moyenne à faire la modification sans passer par un fichier tmp.

    voila le code que j'utilise
    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
     
    ....
                StreamReader sr = null;
                StreamWriter sw = null;
                System.Text.Encoding ANSI = System.Text.Encoding.GetEncoding(1252); 
                string ligne;
                try
                {
                    //fichier Sitetic
                    for (int i = 0; i < fichierSitetic.Length; i++)
                    {
                        cheminFichier = fichierSitetic[i];
                        fichierTmp = cheminFichier.Replace(".txt", "_tmp.txt");
                        sr = new StreamReader(cheminFichier);
                        sw = new StreamWriter(fichierTmp,true,ANSI);
                        ligne = sr.ReadLine();                    
                        while (ligne != null)
                        {
                            if (numLigne == 0) sw.WriteLine(ligne);     
                            else
                            {
                                string [] tabLigne = ligne.Split(';');
                                tabLigne[3] = "999";
                                tabLigne[4] = "MIM";
                                //transformer une table à un string 
                                string nouvLigne = string.Join(";", tabLigne);
                                sw.WriteLine(nouvLigne);
                            }
                            ligne = sr.ReadLine();
                            numLigne++;                       
                        }
                        sr.Close();
                        sw.Close();
                        File.Delete(cheminFichier);
                        File.Move(fichierTmp, cheminFichier);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    // Fermeture streamreader
                    if (sr != null) sr.Close();
                    // Fermeture streamwriter
                    if (sw != null) sw.Close();
                }
    merci d'avance.

  2. #2
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Si tes fichiers ne sont pas trop grands, essaie comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          string[] lignes;
          string[] ligne;
          lignes = File.ReadAllLines("monFichier", Encoding.ASCII);
          for (int i = 1; i < lignes.Length; i++)
          {
            ligne = lignes[i].Split(';');
            ligne[3] = "999";
            ligne[4] = "MIM";
            lignes[i] = string.Join(";", ligne);
     
          }
          File.WriteAllLines("monFichier", lignes, Encoding.ASCII);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    Merci de ta réponse mais malheureusement les fichier sont très grand 450 milles ligne au moyenne.

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    est ce que c'est le bon algorithme car l'exécution c'est long
    A priori, oui.
    Peut-être que le traitement de chaque ligne (Split et Join) prend du termps.

    Gagne-t'on un temps significatif sans traiter la ligne, c.à.d. en faisant simplement "sw.WriteLine(Ligne);" ?

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par Graffito Voir le message
    A priori, oui.
    Peut-être que le traitement de chaque ligne (Split et Join) prend du termps.

    Gagne-t'on un temps significatif sans traiter la ligne, c.à.d. en faisant simplement "sw.WriteLine(Ligne);" ?
    +1

    La premiere chose a faire c'est de voir quel traitement prends le plus de temps

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    j'ai essayé ce matin sans split et Join mais je gagne pas trop de temps. à mon avis c'est les opération de lire et d'écrire qui prend plus de temps. j'ai lu un truc sur JAVA qu'on puisse utilisé les Bugffer je vais regarder sa et je vous tient au courant.

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Dans ce cas il y a deux chose qui peuvent consommer beaucoup de temps

    1- Lire et ecrire +/- en meme temps sur le meme disque physique (c'est sans doute ce que tu fais)
    2- Parcourir des repertoire qui contiennent beaucoup de fichier (le temps d'acces au fichier est exponentiel)

    Ne crois pas ceux qui te disent que le cache gere tres bien tout ca !
    Le cache allege un peu la peine mais c'est tout

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Essaye de créer 2 tableaux internes de n millliers lignes, un pour les ligne lues et un pour les lignes converties. Puis lit une série de n milliers de lignes, convertit la, ecrit la et passe à la lecture de la série suivante. Sans garantie

  9. #9
    Membre expérimenté Avatar de g_tarik0010
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 186
    Par défaut
    Je ne sais pas si ca va t'aider mais tu peux lancer le traitement sur plusieurs threads en même temps le multithreading peut s'avérer une bonne solution aux traitement longs

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par g_tarik0010 Voir le message
    Je ne sais pas si ca va t'aider mais tu peux lancer le traitement sur plusieurs threads en même temps le multithreading peut s'avérer une bonne solution aux traitement longs
    Si la lenteur est liée aux IO multiplier les thread ne t'aidera en rien ou contraire !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    Merci pour vos réponses. Mais toujours traitement très longue. Pour le moment.

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    La meilleure approche c'est vraiment d'isoler chaque process et d'evaluer le temps consommé par chacun


    N.B. : il ne suffit pas de mettre plusieurs timer car le process d'ecriture et move peut affecter la lecture

    En tout cas j'ai deja eu des rapport de 1 a 20 pour ce genre de manipulation simplement en separant lecture et ecriture sur deux media différents

    Il n'est pas non plus impossible que tu puisse gagner beaucoup de temps en faisant tout tes move en une seule fois a la fin de la boucle. (c'est plus dangereux j'en conviens mais intéressant a tester)

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

Discussions similaires

  1. [WD12] modification fichier texte
    Par cgr_007 dans le forum WinDev
    Réponses: 8
    Dernier message: 15/03/2010, 01h19
  2. Modification fichier texte base de donnée
    Par usermap dans le forum C#
    Réponses: 2
    Dernier message: 16/04/2009, 21h28
  3. Shell - Modification fichier texte
    Par bahaaldine dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 28/10/2007, 13h24
  4. Réponses: 6
    Dernier message: 15/12/2006, 19h29

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