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

VB.NET Discussion :

DataGridView et fichier texte


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2021
    Messages : 5
    Par défaut DataGridView et fichier texte
    Bonjour, je cherche à extraire certaines informations d'un fichier texte puis les afficher dans un DataGridView.

    Le fichier est formaté de la manière suivante :

    Nom : Capture.PNG
Affichages : 224
Taille : 19,7 Ko

    Les colonnes du DataGridView correspondent à " nb Lenght mass[g/mol] Chain details "

    J'essaie de récupérer seulement les lignes où le chiffre en dessous de la colonne "mass[g/mol]" est différent de 0
    Par exemple je ne souhaite pas récupérer les lignes "Excellent 0" , "Good 0" pour le premier tableau, mais uniquement les lignes apres "Moderate 6"
    Récupérer le chiffre après "Moderate" est utile pour savoir le nombre de ligne il faut parcourir et afficher pour chaque tableau

    Le meilleur moyen pour y arriver est d'utiliser un StreamReader, lire ligne par ligne et skip celles qui ne sont pas intéressantes?
    Ou c'est plus simple de parcourir tout le fichier avec une boucle?

    En espérant être assez clair, merci d'avance pour l'aide

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Salut,
    StreamReader et boucle sont les bons ingrédients ensemble !
    Avec le premier tu peux ouvrir le fichier en lecture et dans la boucle, tu peux lire chaque ligne avec ReadLine.
    Et pour chaque ligne lue, il te faut vérifier si les champs te conviennent.
    ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2021
    Messages : 5
    Par défaut
    Salut,
    J'essaie donc de le faire avec un StreamReader en parcourant jusqu'à la fin avec une boucle

    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
     
     
        Dim dt_sum_protamex As New DataTable
            dt_sum_protamex.Columns.Add("Number")
            dt_sum_protamex.Columns.Add("Lenght")
            dt_sum_protamex.Columns.Add("Mass [g/mol]")
            dt_sum_protamex.Columns.Add("Chain")
            dt_sum_protamex.Columns.Add("Details")
     
     
     
     Do Until reader.EndOfStream
                getLines = reader.ReadLine()
                If getLines.Contains("nb") And reader.EndOfStream = False Then
                    test = getLines.Substring(6, 2)
                Else
                    reader.ReadLine()
     
                End If
    dt_sum_protamex.Rows.Add(test)
            Loop
    Si je joins le fichier en pièce jointe, ce serait possible de m'aider ?
    Merci d'avance !
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Salut,

    Peux-tu m'envoyer un exemple du résultat que tu veux obtenir à partir de ton fichier ?
    Je veux savoir ce que tu fais des lignes commençant par Code, Moderate, None, ..., bref les lignes qui ne contiennent pas toutes les champs.

    Par exemple, voici le DataTable sans les champs "inutiles" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
          1    7    758.461  MAKLLAL       nb H = 0
          2    9   1041.545  SLSFCFLLL       nb H = 0
          3    3    235.051  GGC       nb H = 0
          4    4    382.119  GGCF       nb H = 0
          5   10   1211.574  ALREQPQQNE       nb H = 0
          6    9    911.505  AGRALTVPQ       nb H = 0
          1    7    758.461  MAKLLAL       no letters H or C
          2   10   1211.574  ALREQPQQNE       no letters H or C
          3    9    911.505  AGRALTVPQ       no letters H or C
          1    9   1041.545  SLSFCFLLL       1 letter H or C
          2    3    235.051  GGC       1 letter H or C
          3    4    382.119  GGCF       1 letter H or C
    Le mieux est que tu présentes comme ci-desus ce que tu veux dans le DataTable.

    J'y regarderai dès que j'aurai ton modèle de résultat.

    ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2021
    Messages : 5
    Par défaut
    Hello, merci pour l'aide !

    Ce serait possible de garder la ligne Code à chaque fois, et pour les autres lignes, uniquement celles où à côté de "Excellent" , "Good", "Moderate", ... le chiffre est différent de 0

    Par exemple dans le fichier, le premier bloc on a

    Nom : Capture7.PNG
Affichages : 176
Taille : 6,7 Ko

    Je voudrais garder la ligne "Moderate 6" + celles que vous avez déjà misent dans le tableau

    Ca ressemblerai à ça du coup :

    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
     
     
     "      "            nb  Lenght  mass[g/mol]  Chain  details
    Code:2 2
     Excellent 
     Good
     Moderate   
                        1    7    758.461  MAKLLAL       nb H = 0
                        2    9   1041.545  SLSFCFLLL       nb H = 0
                        3    3    235.051  GGC       nb H = 0
                        4    4    382.119  GGCF       nb H = 0
                        5   10   1211.574  ALREQPQQNE       nb H = 0
                        6    9    911.505  AGRALTVPQ       nb H = 0
     
     None  
     
    Code: 2 3
     None  
                     1    7    758.461  MAKLLAL       no letters H or C
                     2   10   1211.574  ALREQPQQNE       no letters H or C
                     3    9    911.505  AGRALTVPQ       no letters H or C
     Moderate 
                     1    9   1041.545  SLSFCFLLL       1 letter H or C
                     2    3    235.051  GGC       1 letter H or C
                     3    4    382.119  GGCF       1 letter H or C
     Good                
     Excellent
    En restant sur le modèle du fichier ... J'espère que c'est assez clair, merci d'avance !

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Re,

    Voici une solution très peu élégante qui convient pour le fichier que tu as envoyé.
    Elle devra être ajustée s'il y a des changements dans les longueurs des champs, ou dans leur dénomination, ...

    Si j'ai un encore un peu de temps dans la soirée, je tâcherai d'écricre une solution plus polyvalente. Je ne promets pas ...

    Le 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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    Module Module1
     
        Sub Main()
     
            Dim NomEtCheminDuFichier As String = "D:\Tmp\TXT_Table\test.txt"
            Dim FichierALire As System.IO.StreamReader
            Dim LigneLue As String
     
            If Not System.IO.File.Exists(NomEtCheminDuFichier) Then
                ' Erreur car fichier ininexistant
                ' Peut-être faire message ...
                Exit Sub
            End If
     
            '        ' Créer DataTable pour stockage des données
            Dim dt_sum_protamex As New DataTable
            dt_sum_protamex.Columns.Add("Number")
            dt_sum_protamex.Columns.Add("Lenght")
            dt_sum_protamex.Columns.Add("Mass[g/mol]")  ' Ne pas mettre d'espace dans les noms de colonne (souyrce de problème) mais underscore permis.
            dt_sum_protamex.Columns.Add("Chain")
            dt_sum_protamex.Columns.Add("Details")
     
            '        ' Ouvrir fichier en lecture
            FichierALire = New System.IO.StreamReader(NomEtCheminDuFichier)
     
            '        ' Aquisition des données
            Dim Number As String = ""
            Dim Lenght As String = ""
            Dim Mass As String = ""
            Dim Chain As String = ""
            Dim Details As String = ""
     
            '        ' Passer les lignes inutiles de début de fichier
            LigneLue = FichierALire.ReadLine.Trim()
            While LigneLue = String.Empty And FichierALire.Peek <> -1 ' Pour le cas où il y aurait des lignes vierges en début de fichier
                LigneLue = FichierALire.ReadLine.Trim(" ")
            End While
     
            '        ' Traitement des données et lecture suivante
                While FichierALire.Peek <> -1
                Number = LigneLue.Substring(0, 9).Trim()
                    Select Case Number
                        Case "Code:"
                            Lenght = ""
                        Mass = LigneLue.Substring(17, 1).Trim()
                        Chain = LigneLue.Substring(28).Trim()
                            Details = ""
                            dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                            FichierALire.ReadLine() ' Lecture ligne inutile des titres
                        Case "Excellent", "Good", "Moderate", "None"
                            Lenght = ""
                        Mass = LigneLue.Substring(20).Trim()
                            Chain = ""
                            Details = ""
                            If Mass <> "0" Then
                                dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                            End If
                    Case Else
                        Number = Number.Substring(0, 1).Trim()
                        Lenght = LigneLue.Substring(2, 6).Trim()
                        Mass = LigneLue.Substring(8, 8).Trim()
                        Chain = LigneLue.Substring(19, 10).Trim()
                        Details = LigneLue.Substring(29).Trim()
                        dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                End Select
                LigneLue = FichierALire.ReadLine.Trim()  ' Lecture ligne suivante
                While LigneLue = String.Empty And FichierALire.Peek <> -1   ' Pour le cas où il y aurait des lignes ne contenant que quelques parasites ...
                    LigneLue = FichierALire.ReadLine.Trim()
                End While
     
            End While
     
            FichierALire.Close()
            FichierALire.Dispose()
     
                ' Affichage en mode console (pour test) 
     
            For L As Integer = 0 To dt_sum_protamex.Rows.Count - 1
                For C As Integer = 0 To dt_sum_protamex.Columns.Count - 1
                    Console.Write(dt_sum_protamex.Rows(L)(C) & vbTab)
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
     
        End Sub
     
    End Module
    ...

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Suite ...

    Voici une solution beaucoup plus élégante ... avec l'utilisation des expressions régulières.
    Une seule contrainte, il faut que les valeurs des champs soient séparées par 2 espaces ou plus.
    On ne peut pas utiliser simplement un seul espace comme séparateur car il est utilisé pour écrire les valeurs du champs "Details".
    Dans ton fichier, les valeurs sont séparées par 2 ou 3 espaces, et parfois plus. Cette solution devrait donc convenir.

    Le 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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    Module Module1
     
        Sub Main()
     
            Dim NomEtCheminDuFichier As String = "D:\Tmp\TXT_Table\test.txt"
            Dim FichierALire As System.IO.StreamReader
            Dim LigneLue As String
     
            If Not System.IO.File.Exists(NomEtCheminDuFichier) Then
                ' Erreur car fichier ininexistant
                ' Peut-être faire message ...
                Exit Sub
            End If
     
            '        ' Créer DataTable pour stockage des données
            Dim dt_sum_protamex As New DataTable
            dt_sum_protamex.Columns.Add("Number")
            dt_sum_protamex.Columns.Add("Lenght")
            dt_sum_protamex.Columns.Add("Mass[g/mol]")  ' Ne pas mettre d'espace dans les noms de colonne (souyrce de problème) mais underscore permis.
            dt_sum_protamex.Columns.Add("Chain")
            dt_sum_protamex.Columns.Add("Details")
     
            '        ' Ouvrir fichier en lecture
            FichierALire = New System.IO.StreamReader(NomEtCheminDuFichier)
     
            '        ' Aquisition des données
            Dim Number As String = ""
            Dim Lenght As String = ""
            Dim Mass As String = ""
            Dim Chain As String = ""
            Dim Details As String = ""
     
            '        ' Passer les lignes inutiles de début de fichier
            LigneLue = FichierALire.ReadLine.Trim()
            While LigneLue = String.Empty And FichierALire.Peek <> -1 ' Pour le cas où il y aurait des lignes vierges en début de fichier
                LigneLue = FichierALire.ReadLine.Trim()
            End While
     
            '        ' Traitement des données et lecture suivante   VERSION 2 (avec RegularExpressions pour le Split)
            Dim ValeursDesChamps() As String  ' récupérer un  tableau de résultats
     
            ' Préparer l'outil 
            Dim SeparateurDesChamps As String = " {2,}"  ' Signifie "2 blancs et plus"
            Dim Reg As System.Text.RegularExpressions.Regex                    ' Une instance de la classe RegEx
            Reg = New System.Text.RegularExpressions.Regex(SeparateurDesChamps)       ' Initialiser la classe avec le modèle
     
            While FichierALire.Peek <> -1
                ValeursDesChamps = Reg.Split(LigneLue)         ' Obtenir les résultats de la recherche sur une ligne
                ' Number est toujours en 0 et les autres valeurs occupent les positions suivantes du tableau : 1, 2, ...
                Number = ValeursDesChamps(0)   ' Number est toujours en 0
                Select Case Number
                    Case "Code:"
                        Lenght = ""
                        Mass = ValeursDesChamps(1)
                        Chain = ValeursDesChamps(2)
                        Details = ""
                        dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                        FichierALire.ReadLine() ' Lecture ligne inutile des titres
                    Case "Excellent", "Good", "Moderate", "None"
                        Lenght = ""
                        Mass = ValeursDesChamps(1)
                        Chain = ""
                        Details = ""
                        If Mass <> "0" Then
                            dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                        End If
                    Case Else
                        Lenght = ValeursDesChamps(1)
                        Mass = ValeursDesChamps(2)
                        Chain = ValeursDesChamps(3)
                        Details = ValeursDesChamps(4)
                        dt_sum_protamex.Rows.Add(Number, Lenght, Mass, Chain, Details)
                End Select
                LigneLue = FichierALire.ReadLine.Trim()  ' Lecture ligne suivante
                While LigneLue = String.Empty And FichierALire.Peek <> -1   ' Pour le cas où il y aurait des lignes ne contenant que quelques parasites ...
                    LigneLue = FichierALire.ReadLine.Trim()
                End While
            End While
     
            FichierALire.Close()
            FichierALire.Dispose()
     
                ' Affichage en mode console (pour test) 
     
            For L As Integer = 0 To dt_sum_protamex.Rows.Count - 1
                For C As Integer = 0 To dt_sum_protamex.Columns.Count - 1
                    Console.Write(dt_sum_protamex.Rows(L)(C) & vbTab)
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
     
        End Sub
     
    End Module
    ...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2021
    Messages : 5
    Par défaut
    Hello,

    J'avais également trouvé une solution mais qui n'était pas très élégante pour le coup :p

    J'ai donc repris la première que vous m'avez proposé et qui fonctionne très bien

    Le code avec les Regex ne fonctionnent pas mais je vais quand même essayé de l'utiliser !

    Encore merci

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Qu'est qui ne va pas avec Regex ?
    SI tu as des messages d'erreurs ou des anomalies dans les résultats, tu peux envoyer ...., j'y regarderai.
    Je pense qu'il y a plus de risques de disfonctionnements avec ma première solution.
    ...

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2021
    Messages : 5
    Par défaut
    Erreur de ma part ... C'est parce que le fichier que je vous ai donné était qu'un fichier de test, dans celui que j'utilise il y a des lignes que je dois skip car ce sont des codes.

    Merci beaucoup pour l'aide, et pour l'utilisation de RegEx dans cette situation je n'y aurais pas pensé !

    Bonne soirée

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

Discussions similaires

  1. importer ce fichier text dans une datagridview
    Par ahmedfa71 dans le forum VB.NET
    Réponses: 15
    Dernier message: 04/04/2019, 16h20
  2. Réponses: 9
    Dernier message: 07/12/2017, 20h19
  3. Fichier texte via datagridview
    Par DD-78 dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/12/2013, 09h41
  4. Fichier text et datagridview
    Par biquet dans le forum VB.NET
    Réponses: 14
    Dernier message: 09/03/2011, 14h10
  5. Réponses: 4
    Dernier message: 06/09/2010, 20h08

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