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#

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 : 2 037
    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

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, 19h34
  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, 09h24
  3. Erreur sur lecture/ecriture fichier
    Par HeB91 dans le forum SharePoint
    Réponses: 2
    Dernier message: 26/01/2010, 09h29
  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, 15h11
  5. message d'erreurs sur copie de fichier
    Par screeminelle dans le forum C++
    Réponses: 9
    Dernier message: 01/11/2005, 14h21

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