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 :

streamreader erreur sur taille du fichier


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut streamreader erreur sur taille du fichier
    Bonjour

    Je viens chercher votre aide sur un mystère de la science que je n'arrive pas à résoudre

    avec ce code
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
                        StreamReader MonFichier = new StreamReader(CheminFichierACharger, Encoding.Default);
     
                        String LigneEnCours = "";
                        do                      // On passe l'entete du fichier (mis en commentaire par des // en tete de ligne)
                        {
                            LigneEnCours = MonFichier.ReadLine(); 
                        } while (LigneEnCours.Substring(0, 2) == "//");
                        //ici la ligne contient la première ligne de paramètre qui commence par #
                        string[] tabCSV = LigneEnCours.Split(';');   // on recupère un tableau de string avec chaque contenu entre ;
                        int NbChamps = tabCSV.GetUpperBound(0) ; // recherche nombre de colonnes dans le fichier
     
                        string[] tabVoie = new string[NbChamps];
                        string[] tabNom = new string[NbChamps];
                        string[] tabUnite = new string[NbChamps];
     
                        for (i = 0; i < NbChamps; i++) //Init des tableaux de paramètre avant lecture du fichier CSV
                        {
                            tabVoie[i] = "";
                            tabNom[i] = "";
                            tabUnite[i] = "";
                        }
     
                        while (LigneEnCours.Substring(0, 1) == "#")    // On passe les paramètres (Ils commencent par "#")
                        {
                            if (LigneEnCours.Substring(0, 5) == "#Voie") tabVoie = LigneEnCours.Split(';');     // on recupère un tableau de string avec chaque contenu entre ;
                            if (LigneEnCours.Substring(0, 4) == "#Nom") tabNom = LigneEnCours.Split(';');       // on recupère un tableau de string avec chaque contenu entre ;
                            if (LigneEnCours.Substring(0, 6) == "#Unite") tabUnite = LigneEnCours.Split(';');   // on recupère un tableau de string avec chaque contenu entre ;
     
                            LigneEnCours = MonFichier.ReadLine(); // leture de la ligne suivante
                        }
                        //ici on a la ligne avec les min max
     
                        double TailleFichier = MonFichier.BaseStream.Length; //quelle est la taille du fichier ?
     
                        List<BinaryWriter> ListWriter = new List<BinaryWriter>(); //création d'une liste de binarywriter pour créer autant de fichiers qu'il y a de champ data dans le CSV
     
                        for (i=1 ; i<=NbChamps ; i++) //création des binarywriter
                        {
                            string fileName = CheminRepertoireTemporaire+ "\\" + i.ToString() + "-" + tabNom[i].ToString() + ".par";
                            BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)) ;
     
                            ListWriter.Add(writer);
                        }
     
                        while (MonFichier.BaseStream.Position < TailleFichier) // remplissage des binaryWriter, tant que je ne suis pas à la fin du fichier
                        {
                            string ligne = MonFichier.ReadLine();         // lecture d'une ligne
                            tabCSV = ligne.Split(';');                    // récupération du tableau de string avec chaque contenu entre ;
     
                            string[] FormatsDates = new string[8] { "dd/MM/yyyy", "d/M/yyyy", "dd/MM/yyyy HH:mm:ss.fff", "d/M/yyyy HH:mm:ss.fff", "dd/MM/yyyy HH:mm:ss", "d/M/yyyy HH:mm:ss", "dd/MM/yyyy HH:mm", "d/M/yyyy HH:mm" };//formats possible de date
     
                            double date = DateTime.ParseExact(tabCSV[0], FormatsDates, null, System.Globalization.DateTimeStyles.None).ToOADate();
                            double LaValeur = 0;
                            for (i = 0; i < NbChamps; i++)
                            {
                                try
                                {
                                    LaValeur = Convert.ToDouble(tabCSV[i+1], CultureInfo.InvariantCulture);
                                }
                                catch
                                {
                                    break;
                                }
                                ListWriter[i].Write(date);
                                ListWriter[i].Write(LaValeur);
                            }
                        }
                        MonFichier.Close();             // On ferme le streamreader
     
                        for (i = 0; i < NbChamps; i++) // destruction des binarywriter
                        {
                            ListWriter[i].Close();      // fermeture 
                            ListWriter[i].Dispose();    // libération des ressources
                        }
     
                        ListWriter.Clear();
    je lis des fichiers .csv dont le premier champ est une date et je crée autant de fichier qu'il y a de champ (autre que la date).

    Ce code marche a merveille depuis plusieurs semaines avec des très gros fichiers de plus le 5 millions de lignes.

    Avec le fichier joint ça ne fonctionne pas et ce d'une manière trés étrange :
    quand on arrive sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (MonFichier.BaseStream.Position < TailleFichier)
    on a dans "LigneEnCours" la dernière ligne d’entête et j'ai bien "Date;charge", c'est OK
    sauf qu'il reste alors 21 lignes (les données) dans le fichier et que le code me dit que MonFichier.BaseStream.Position = 623 = TailleFichier ! du coup il sort direct sans lire les données !!???

    J'ai cru un moment que mon fichier CSV avait un défaut et que la dernière ligne d’entête était lue comme une seule grande ligne qui va jusqu'à la fin du fichier mais non, la dernière ligne lue est bien à "Date;charge", la fin du fichier n'est pas encore lue !

    Ci joint un fichier qui passe (un très gros fichier auquel j'ai viré pleins de lignes) et le fichier qui ne passe pas....Je ne vois pas de différence de structure, le problème ne vient pas du nombre de champs, j'ai testé.

    Si vous avez une idée je vous remercie par avance
    Fichiers attachés Fichiers attachés
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut
    .utaise je viens de comprendre l'origine du problème

    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double TailleFichier = MonFichier.BaseStream.Length;
    qui ne me donne pas la taille du fichier !

    Sur le fichier exemple ci dessus qui marche, j'ai les 12 dernières lignes qui ne sont pas lues !

    si j'ajoute des lignes "inutiles" à mon fichier qui ne fonctionne pas ca marche !

    BaseStream.Length ne donnerait que la taille du fichier au delà de la position en cours ?
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  3. #3
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par petitours Voir le message
    si j'ajoute des lignes "inutiles" à mon fichier qui ne fonctionne pas ca marche !

    BaseStream.Length ne donnerait que la taille du fichier au delà de la position en cours ?
    deux questions :

    • En cours de traitement, le BaseStream.Length doit rester constant, si ce n'est pas le cas, c'est "plus" qu'étrange.
    • Combien de lignes et/ou caractères faut-il ajouter à la fin du fichier qui ne marche pas pour qu'il marche ? ne serait-ce pas le nombre de lignes et/ou caractères des commentaires de début de fichier ?


    Si jamais la piste de la 2eme question est bonne, les fichiers qui semblaient marcher sont à vérifier....
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

Discussions similaires

  1. erreur sur une macro fichier texte
    Par erlerwade dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 03/04/2012, 20h34
  2. Erreur sur ouverture de fichier Excel
    Par nihilist dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 02/09/2010, 10h24
  3. Erreur sur lecture/ecriture fichier
    Par HeB91 dans le forum SharePoint
    Réponses: 2
    Dernier message: 26/01/2010, 10h29
  4. (VBA-E) Erreur sur ouverture de fichier
    Par Stutak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/08/2006, 16h11
  5. message d'erreurs sur copie de fichier
    Par screeminelle dans le forum C++
    Réponses: 9
    Dernier message: 01/11/2005, 15h21

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