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 :

Ecriture dans un binarywriter qui ne commence pas au début


Sujet :

C#

Vue hybride

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 Ecriture dans un binarywriter qui ne commence pas au début
    Bonjour

    Je tente de faire une moulinette qui me crée un fichier par champ contenu dans un fichier CSV.

    J'ouvre donc le fichier CSV, je récupère le nombre de champ et leur nom puis je fais ceci (pour tester la création des fichiers)
    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
                        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
     
                        int i = 0;
                        for (i=1 ; i<=NbChamps ; i++) //création des binarywriter
                        {
                            string fileName = Properties.Settings.Default.CheminTravail.ToString() + "\\" + i.ToString() + "-" + tabNom[i].ToString() + ".txt";
                            BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)) ;
     
                            ListWriter.Add(writer);
                        }
     
                        for (i = 0; i < NbChamps; i++) // Remplissage des binarywriter
                        {
                            String test = "Hello world " + i.ToString();
                            ListWriter[i].Seek(0, SeekOrigin.Begin); // on part du début du fichier
                            ListWriter[i].Write(test);
                        }
     
                        for (i = 0; i < NbChamps; i++) // destruction des binarywriter
                        {
                            ListWriter[i].Close();      // fermeture 
                            ListWriter[i].Dispose();    // libération des ressources
                        }
     
                        ListWriter.Clear();
    Malgré la ligne avec "Seek", le "Hello world" ne s’écrit pas au début du fichier. Sur les 14 fichiers .txt que je crée, tous ont un(plusieurs?) caractères bidons écrits avant le "H".
    Le seek ne change rien en fait.

    A quoi cela est il du ? Comment dois je faire pour le faire partir proprement du début ?

    PS : je n'ai pas mis le préfixe "débutant" parce que avoir réussi à créer dynamiquement ces binarywriter est un exploit pour moi ; je me prends pour un bon du coup pour quelques instants...

    Merci par avance

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Bonjour,

    Il y a plusieurs problèmes :

    La list de BinaryWriter m'a fait frémir dans le dos , ainsi que tes 3 boucles.

    De plus tu écris en binaire , c'est donc normal qu'il y ai des caractères indésirables , essaye donc d'écrire un int ou autre chose , tu verras que ton fichier est illisible.

    Je te propose donc d'utiliser StreamWriter tout simplement , et de faire qu'une seul boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                         StreamWriter writer;
                        for (i=0 ; i<NbChamps ; i++) 
                        {
                            string fileName = Properties.Settings.Default.CheminTravail.ToString() + "\\" + i.ToString() + "-" + tabNom[i].ToString() + ".txt";
                            String test = "Hello world " + i.ToString();
                            writer = new StreamWriter(fileName);
                            writer.WriteLine(test);
                            writer.Close();
                        }
    Voila , le code est beaucoup moins long ,fait la même chose et ça écrit bien au début.

  3. #3
    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
    Argh je n'ai oublier de préciser des choses...

    J'ai un BinaryWriter parce que une fois mon test terminé je compte bien enregistrer du binaire dans ce fichier (des montagnes de doubles à la suite les un les autres). Le "HelloWord" est juste là pour tester la création des fichiers. Ce serait le string qui serait composé d'octets d'en-tête ?

    Ensuite le but est de remplir les X BinaryWriter (X = nombre de champ de mon CSV) avec les données des champs du fichier CSV. Ainsi l'algo final basé sur mon essai actuel serait de ce genre

    -Lecture de l’entête du CSV avec les noms des champs
    -Création des X BinaryWriter, qui portent le nom des X champs du CSV
    -Pour chaque ligne du CSV :
    |lecture de la ligne et split
    |écriture de la valeur correspondante au bon champ dans chacun des X binaryWriter
    -Une fois le CSV entièrement lu => fermeture des X BinaryWriter

    Une boucle plus simple comme proposée m'obligerait à balayer X fois le fichier pour remplir les BinaryWriter chacun leur tour. Mes fichiers CSV étant très gros (aujourd'hui j'ai jusqu'à 10millions de lignes, peut être plus demain avec plusieurs 10n de champs), je préfère éviter de faire X fois la lecture et le split de toutes les lignes.
    C'est ça qui m'a amené à faire ma liste de BinaryWriter... Je me suis creusé en plus pour penser à ça

    Merci

  4. #4
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Dans ce cas il faut être un peu plus précis dès le début car tu avais un faux-problème.

    Oui les string ont quelques bytes en entête , mais si tu veux les écrire sans tu peux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    string test = "Bonjour";
                    byte[] btest = System.Text.Encoding.ASCII.GetBytes(test);
                    writer.Write(btest);

  5. #5
    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
    Formidable, j'aime les faux problèmes !

    Et dans ce contexte, la list de binaryWriter donne toujours des frissons dans le dos ? (je ne sais pas comment faire autrement)

    Merci

Discussions similaires

  1. Afficher les pseudos qui ne commencent pas par une lettre.
    Par asoka13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/07/2007, 17h30
  2. Réponses: 8
    Dernier message: 01/03/2007, 08h44
  3. Réponses: 2
    Dernier message: 06/02/2007, 09h17
  4. Réponses: 10
    Dernier message: 07/01/2007, 12h03
  5. Query Contains dans Full-Text qui ne retourne pas de valeurs
    Par icebe dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/02/2006, 14h04

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