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 :

decouper un fichier quelconque


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Par défaut decouper un fichier quelconque
    bonjour,
    salut tout le monde, je suis nouveau ici dans le monde de C# et comme premiere tache que je dois faire c'est de decouper un fichier text de taille qui peu même arriver a plusieur Go on plusiers fichier qui ne depasse pas les 200Mo.
    merci d'avance.

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    bonjour,

    utilise la méthode readblock :
    http://msdn.microsoft.com/fr-fr/libr...readblock.aspx

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par jacky01 Voir le message
    bonjour,

    utilise la méthode readblock :
    http://msdn.microsoft.com/fr-fr/libr...readblock.aspx
    c'est pas mal, mais ça permet pas de ne pas couper les lignes...

  4. #4
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Effectivement s'il faut en ligne ce n'est pas la bonne fonction.

    Mais rien à été précisé

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    quelles sont les contraintes ? si c'est du texte, je suppose qu'il ne faut pas couper les lignes ?

    Tu pourrais faire quelque chose comme ç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
     
    string inputFileName = @"grosFichier.txt"; // fichier à découper
    string partFileNameTemplate = @"grosFichier_part{0}.log"; // modèle des noms de fichiers partiels
    int iPart = 0; // numéro du fichier partiel
    int maxLength = 200 * 1024 * 1024; // taille max des fichiers partiels (200Mo)
    using (StreamReader reader = new StreamReader(inputFileName))
    {
    	Encoding encoding = reader.CurrentEncoding;
    	string line = reader.ReadLine(); // 1ere ligne du fichier
    	byte[] lineBytes = null;
    	if (line != null) lineBytes = encoding.GetBytes(line + Environment.NewLine); // octets de la ligne en cours
    	while(line != null) // tant qu'il reste des lignes à traiter
    	{
    		 // octets pour cette ligne + retour à la ligne
    		iPart++; // on incrémente le numéro de fichier partiel
    		string partFileName = string.Format(partFileNameTemplate, iPart); // nom du fichier partiel
    		using (FileStream partStream = File.OpenWrite(partFileName))
    		{
    			// tant qu'on ne dépasse pas la taille max et qu'il reste des lignes à traiter
    			while (partStream.Length + lineBytes.Length <= maxLength && line != null)
    			{
    				partStream.Write(lineBytes, 0, lineBytes.Length); // on écrit la ligne dans le fichier partiel
    				line = reader.ReadLine(); // on lit la ligne suivante
    				lineBytes = encoding.GetBytes(line + Environment.NewLine); // octets de la ligne en cours
    			}
    		}
    	}
    }
    J'ai pas beaucoup testé, faut vérifier si ça marche bien...

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Par défaut
    Citation Envoyé par tomlev Voir le message
    quelles sont les contraintes ? si c'est du texte, je suppose qu'il ne faut pas couper les lignes ?

    Tu pourrais faire quelque chose comme ç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
     
    string inputFileName = @"grosFichier.txt"; // fichier à découper
    string partFileNameTemplate = @"grosFichier_part{0}.log"; // modèle des noms de fichiers partiels
    int iPart = 0; // numéro du fichier partiel
    int maxLength = 200 * 1024 * 1024; // taille max des fichiers partiels (200Mo)
    using (StreamReader reader = new StreamReader(inputFileName))
    {
    	Encoding encoding = reader.CurrentEncoding;
    	string line = reader.ReadLine(); // 1ere ligne du fichier
    	byte[] lineBytes = null;
    	if (line != null) lineBytes = encoding.GetBytes(line + Environment.NewLine); // octets de la ligne en cours
    	while(line != null) // tant qu'il reste des lignes à traiter
    	{
    		 // octets pour cette ligne + retour à la ligne
    		iPart++; // on incrémente le numéro de fichier partiel
    		string partFileName = string.Format(partFileNameTemplate, iPart); // nom du fichier partiel
    		using (FileStream partStream = File.OpenWrite(partFileName))
    		{
    			// tant qu'on ne dépasse pas la taille max et qu'il reste des lignes à traiter
    			while (partStream.Length + lineBytes.Length <= maxLength && line != null)
    			{
    				partStream.Write(lineBytes, 0, lineBytes.Length); // on écrit la ligne dans le fichier partiel
    				line = reader.ReadLine(); // on lit la ligne suivante
    				lineBytes = encoding.GetBytes(line + Environment.NewLine); // octets de la ligne en cours
    			}
    		}
    	}
    }
    J'ai pas beaucoup testé, faut vérifier si ça marche bien...
    j'ai aucune contrainte particulier a part que la methode doi etre vraiment rapide
    mais je pense pas qui faut couper les ligne par ce que apres on va rassembler tout les parti d'un meme fichier pour le remettre a ca place
    mais on veux decouper le fichier pour le seule but de modification et d'ajout dans un fichier, par cequ'on pense que c'est mieux que de ecraser tout le fichier
    par ce que comme j'ai dit ou debut les fichier peuvent arriver a plusieurs Go

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par gharras Voir le message
    mais je pense pas qui faut couper les ligne par ce que apres on va rassembler tout les parti d'un meme fichier pour le remettre a ca place
    ben dans ce cas c'est encore plus simple, il n'y a plus besoin de se préocuper des lignes et de l'encodage :

    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
    string inputFileName = @"grosFichier.txt"; // fichier à découper
    string partFileNameTemplate = @"grosFichier_part{0}.log"; // modèle des noms de fichiers partiels
    int iPart = 0; // numéro du fichier partiel
    int maxLength = 200 * 1024 * 1024; // taille max des fichiers partiels (200Mo)
    using (FileStream inputStream = File.OpenRead(inputFileName))
    {
    	byte[] buffer = new byte[8192];
            int nRead = inputStream.Read(buffer, 0, buffer.Length);
    	while(nRead > 0) // tant qu'il reste des données à lire
    	{
    		iPart++; // on incrémente le numéro de fichier partiel
    		string partFileName = string.Format(partFileNameTemplate, iPart); // nom du fichier partiel
    		using (FileStream partStream = File.OpenWrite(partFileName))
    		{
    			// tant qu'on ne dépasse pas la taille max et qu'il reste des données à lire
    			while (partStream.Length + nRead <= maxLength && nRead > 0)
    			{
    				partStream.Write(buffer, 0, nRead); // on écrit la ligne dans le fichier partiel
                                    int maxRead = Math.Min(buffer.Length, maxLength - partStream.Length);
                                    nRead = inputStream.Read(buffer, 0, maxRead);
    			}
    		}
    	}
    }

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 86
    Par défaut
    merci pour ton aide, mais est ce que la deuxieme methode et plus rapide que la premiere
    et j'ai une deuxieme question svp
    trouver un petit probleme a cause de la ram je n'ai que 1Go de ram donc je trouve une exception d etype OutOfMemoryException dans mon system XP, contrairement a mon copain qui a un vista de 2Go de ram il n a pas eu de probleme et le code a bien marcher
    je me demande si le problee viens du system ou de la ram et desole pour le derrangement

  9. #9
    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
    mais on veux decouper le fichier pour le seule but de modification et d'ajout dans un fichier, par cequ'on pense que c'est mieux que de ecraser tout le fichier
    Je pense que l'on est dans la situation classique de debatre de solutions sans avoir clairement posé le probléme original !

    C'est a dire le besoin !

    Peux tu expliquer ce que tu dois faire et dans quel contexte ?
    Peut etre que la meilleure solution sera plus facile a trouver

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par gharras Voir le message
    merci pour ton aide, mais est ce que la deuxieme methode et plus rapide que la premiere
    A priori la 2e méthode est légèrement plus rapide, mais je ne pense pas que la différence soit très importante. Faudrait faire des tests de perfs pour comparer...

    Citation Envoyé par gharras Voir le message
    et j'ai une deuxieme question svp
    trouver un petit probleme a cause de la ram je n'ai que 1Go de ram donc je trouve une exception d etype OutOfMemoryException dans mon system XP, contrairement a mon copain qui a un vista de 2Go de ram il n a pas eu de probleme et le code a bien marcher
    je me demande si le problee viens du system ou de la ram et desole pour le derrangement
    Les méthodes que je t'ai proposées n'utilisent quasiment pas de mémoire, vu qu'on ne charge pas tout le fichier en mémoire mais seulement une ligne à la fois (ou un bloc de 8Ko dans la 2e méthode). Donc tu ne devrais pas avoir de problème de RAM...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/06/2007, 17h37
  2. Réponses: 1
    Dernier message: 15/06/2007, 17h35
  3. Réponses: 2
    Dernier message: 16/08/2006, 23h57
  4. Extraire le texte d'un fichier quelconque
    Par avogadro dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 13h26
  5. Ouverture d'un fichier quelconque
    Par OtObOx dans le forum Access
    Réponses: 4
    Dernier message: 31/05/2006, 23h31

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