none
Décomposer les lignes d'un fichier texte avec StreamReader RRS feed

  • Question

  • Bonjour je cherche à décomposer les lignes d'un fichier texte en utilisant StreamReader comme suit :

    on part de la position 0 de ligne donc de la lettre E. exemple avec la 1ere du fichier texte ci-joint :

    on décompose :

    E

    42LMJ

    0

    42LMJ

    Voici un début de code et une capture du fichier texte :

    E42LMJ042LMJ022000000000000MASSARD             20.06.1809:0020.06.1816:0019.06.1821:00
    E71CW5071CW5100000000000000PROVENT             20.06.1812:3020.06.1814:0019.06.1823:30
    E71CW5171CW5100000000000000PROVENT             20.06.1812:3020.06.1814:0019.06.1823:30
    E42DSK042DSK122000000000000MASSARD             20.06.1811:0020.06.1815:0019.06.1809:00
    E01ANZ001ANZ017000000000000CIRHYO              20.06.1814:0020.06.1816:3020.06.1802:00

     static void Main(string[] args)
            {
                Console.WriteLine("Go!");
                Console.ReadLine();
                string file = @"C:\Dropbox\Qualite\SavePcm\Fichierlots020718.txt";
                char[] b = new char[file.Length];
                using (var reader1 = new StreamReader(file))
                {
                    while (!reader1.EndOfStream)
                    {
                        string line1 = reader1.ReadLine();
                        if (line1.StartsWith("E"))
                        {
                            reader1.Read(b, 0, 1);
                            Console.WriteLine(b);
    
                            reader1.Read(b, 5, file.Length - 1);
                            Console.WriteLine(b);
                        }
                    }
                }
            }


    JF Collombet ® CreateSpecificCulture

    samedi 8 septembre 2018 05:35

Réponses

Toutes les réponses

  • Bonjour,

    Alors j'ai lu la doc là

    StreamReader.Read méthode (Char[], Int32, Int32)

    pour être sûr de bien lire ceci

    reader1.Read(b, 5, file.Length - 1);

    donc on commence à écrire à la position 5 du tampon, pour y écrire autant de caractères qu'il y a dans le fichier, moins un. Or, le tampon est dimensionné à la taille du fichier. Donc, si je calcule bien, il doit manquer quelque chose comme quatre ou cinq caractères de place dans le tampon pour réaliser l'opération demandée.

    Ce qui se solde par une ArgumentException, ce que la documentation explicite comme ceci : "La longueur de la mémoire tampon moins index est inférieure à count."

    Eh bien j'ai envie de dire ceci : ce n'est vraiment pas souvent du tout, mais pour une fois, j'ai l'impression que Microsoft a dit en Français correct ce qu'il y avait à dire.

    **

    Euh, après je relis le code, et je vois que dans file c'est le chemin du fichier qu'il y a. Bon sans vouloir insister trop, c'est l'inconvénient d'un nom de variable approximatif. Toutefois, ArgumentException est à interpréter selon une tambouille du même style.

    • Modifié Gloops mercredi 12 septembre 2018 00:15
    mercredi 12 septembre 2018 00:04
  • Est-ce que je peux suggèrer l'utilisation d'une Expression Regulière RegEx pour décomposer les lignes selon un schéma prédeterminé?

    C'est peut être plus flexible également.

    La RegEx pourrait être:

    E on commence par E

    (.{5}) 5 caractères

    . un caractère peu importe lequel

    (.{5}) 5 caractères

    . un caractère

    (\d{14}) 14 chiffres

    ([^\s]+)\s+ des caractères suivis d'un ou plusieurs blancs

    ensuite le moule pour les chiffres.

    Cela donne:

    Avec le bout de code:

            pattern = "E(.{5}).(.{5}).(\d{14})([^\s]+)\s+(\d{2}\D\d{2}\D\d{4}:\d{2})(\d{2}\D\d{2}\D\d{4}:\d{2})(\d{2}\D\d{2}\D\d{4}:\d{2})"
            Dim r As Regex = New Regex(pattern, RegexOptions.IgnoreCase)
            RichTextBox2.Clear()
    
            Dim LigneLue As String
            For i As Integer = 0 To RichTextBox1.Lines.Count - 1
                LigneLue = RichTextBox1.Lines(i)
    
                Dim m As Match = r.Match(LigneLue)
                For indexGroup = 0 To m.Groups.Count - 1
                    If indexGroup = 0 Then
                        RichTextBox2.AppendText("Ligne lue : " & m.Groups(0).ToString & Environment.NewLine)
                    Else
                        RichTextBox2.AppendText("Groupe : " & m.Groups(indexGroup).ToString & Environment.NewLine)
                    End If
                Next
    
            Next

    mercredi 3 octobre 2018 19:34
  • Bonjour,

    Comme je vois ce format de fichier revenir sur le tapis de temps à autre, je remarque que Powershell peut être de nature à permettre une certaine souplesse, en ne nécessitant pas de compilation.

    D'un autre côté, il faut compter plus de cinq minutes pour le maîtriser.

    Autrement pour appliquer des formats (tant de caractères pour tel champ), il y a SSIS, si on veut importer les données dans une base de données. La même remarque s'applique pour le temps à y passer.

    • Modifié Gloops lundi 8 octobre 2018 14:31
    lundi 8 octobre 2018 14:29
  • Bonjour,

    Si vous souhaitez "parser" un fichier texte, qui semble positionnelle, ce projet pourrait vous intéresser : FileHelpers.

    Il s'agit d'un projet Free et Open Source.

    mardi 16 octobre 2018 14:56