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 :

multilignes + listes [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Septembre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2019
    Messages : 34
    Points : 14
    Points
    14
    Par défaut multilignes + listes
    Bonjour à tous !

    Voilà, depuis une semaine je me suis mis à visual basic pour répondre à une demande en entreprise.
    la problématique est la suivante :

    j'ai 3000 fichiers textes (contenu désorganisé) contenant chacun 94 lignes (ce sont des résultats d'essais) soit 282000 lignes au total.
    Or sur ces fichiers textes, j'ai besoin de récupérer uniquement quelques lignes (la 3 - 4 - et une dernière "flottante" correspondant à l'endroit ou le test à échoué) et ce pour chacun des 3000 fichiers.

    Du coup je me suis beaucoup renseigné sur les aides, ce forum et d'autres pour parvenir à ce programme :

    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
    Imports System.IO
    Imports System.Text
    'DUT ANALYSER
     
    Public Class Form1
        Dim chemin, path, bloc, x, y, z As String
        Dim testpos, i As Integer
        Dim pathwriter As StreamWriter
        Dim lst As New List(Of String)
     
     
        Private Sub odtbut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles odtbut.Click
            If path = "" Then
                MsgBox("Please, select first a destination file", MsgBoxStyle.Exclamation, "No destination file")
            Else
                'select only txt files
                OpenFileDialog1.Filter = "Text (*.txt)|*.txt"
                OpenFileDialog1.Multiselect = True
     
                If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
     
                    'open a window to choose the path of the TXT file
                    chemin = OpenFileDialog1.FileName
                    lst.Add(chemin)
     
                    For Each chemin In lst
     
                        'the file is readed by this application
                        Dim file() As String = IO.File.ReadAllLines(chemin)
                        Dim nblignes = file.Length - 1
     
                        'lbl1.Text = file(4).ToString 'used to see if the programm worked
                        'lbl2.Text = file(94).ToString
                        'comparaison is done with the number of lines : the test stop automatically when it fails, so you always have
                        'less datas than a passed test : it means less lines
                        ' if the test is failed, this programm will search all lines where test failed
                        'test 
                        y = Mid(file(3), 45, 6) 'we take the serial number
                        z = Mid(file(4), 35, 6)
                        lbl1.Text = y
                        lbl2.Text = z
                        'we write in the TXT document we opened earlier (the final one)
                        pathwriter = New StreamWriter(path, True, Encoding.Unicode)
                        If nblignes < 94 Then
                            pathwriter.WriteLine(y & ";" & z & ";" & nblignes & "failed")
                            lbl3.Text = nblignes & "   " & "failed"
                        Else
                            pathwriter.WriteLine(y & ";" & z & ";" & nblignes & "success")
                            lbl3.Text = nblignes & "   " & "success"
                        End If
                        pathwriter.Close()
                        'print the number of files tested
                        i = i + 1
                        lbl5.Text = i
                    Next
                Else
                    MsgBox("No file selected, please choose one file", MsgBoxStyle.Exclamation, "No file selected")
                End If
            End If
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'we pick up the path of the tested folder
            'select only txt files
            OpenFileDialog2.Filter = "Text (*.txt)|*.txt"
            If OpenFileDialog2.ShowDialog() = Windows.Forms.DialogResult.OK Then
                path = OpenFileDialog2.FileName
                ' i is the counter of txt documents you analyse
                i = 0
                Button1.Enabled = False 'to avoid missclicks
            Else
                MsgBox("No file selected, please choose one file", MsgBoxStyle.Exclamation, "No file selected")
            End If
     
        End Sub
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            path = ""
     
        End Sub
    End Class

    (j'ai commenté le code en anglais car je suis actuellement en Irlande)
    Le code en soit fait parfaitement ce que je lui demande : le problème c'est qu'il gère le truc fichier par fichier et réitérer le processus 3000 fois est beaucoup trop pénible : et ce même si j'arrive à sélectionner tous les fichiers que je veux traiter dans l'openfiledialog.
    j'ai tenté de rectifier ça avec une liste et une boucle for each mais elle retourne uniquement le dernier fichier lu.

    Pourriez vous m'aider à adapter ce programme pour faire en sorte que tous les fichiers soient traités et pas uniquement le dernier ?

    J'essaie pas d'avoir un truc tout cuit, mais franchement, un coup de main serait sympa.

    Merci !

  2. #2
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je manque de temps pour vraiment étudier ta question, mais après l'avoir survolée, je pense que l'indice suivant pourrait t'être utile.

    Tu actives le MultiSelect de ton OpenFileDialog mais tu ne récupères qu'un chemin à la fois, aussi pourquoi ne pas t'intéresser à la propriété FileNameS (avec S)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    ' et lire les chemins en parcourrant la collection, ça devrait ressembler à ceci :
     
    For Each S As String in OpenFileDialog1.FileNames
    chemin = S
    ' ... ... ...
    J'espère que ça t'aidera ...

  3. #3
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Salut,
    Que veux tu faire ?
    1. Sélectionner tous les fichiers dans ta boite de dialogue
    2. Ou sélectionner un dossier et lire l’ensemble des fichiers qu'il contient


    Je pense que la seconde est la plus ergonomique.
    Merci de ainsi que d'utiliser les boutons et

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Septembre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2019
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    Bonjour,

    Je manque de temps pour vraiment étudier ta question, mais après l'avoir survolée, je pense que l'indice suivant pourrait t'être utile.

    Tu actives le MultiSelect de ton OpenFileDialog mais tu ne récupères qu'un chemin à la fois, aussi pourquoi ne pas t'intéresser à la propriété FileNameS (avec S)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    ' et lire les chemins en parcourrant la collection, ça devrait ressembler à ceci :
     
    For Each S As String in OpenFileDialog1.FileNames
    chemin = S
    ' ... ... ...
    J'espère que ça t'aidera ...

    Merci beaucoup pour ta réponse, j'avoue pas avoir vu le S, je vais essayer ça !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Septembre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2019
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par r.morel Voir le message
    Salut,
    Que veux tu faire ?
    1. Sélectionner tous les fichiers dans ta boite de dialogue
    2. Ou sélectionner un dossier et lire l’ensemble des fichiers qu'il contient


    Je pense que la seconde est la plus ergonomique.
    Salut !

    Je partirais sur la deuxième solution : pourquoi : parce que les fichiers textes que me renvoient les bancs d'essais me sont transmis de façon désorganisée.
    Ils ne viennent pas dans un dossier spécifique

    ce que je veux faire précisemment c'est :
    sélectionner les fichiers textes dans une fenêtre (type openfiledialog)
    les traiter avec le programme en simultané et non pas en 1 by 1 (parce que la j'en ai 3000, aller en une matinée de clique à répétition c'est fini : mais le jour ou tu en as 300 000 ... voilà )

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Septembre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2019
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Phil rob,

    Ta solution marche bien !
    Le truc c'est que l'appli devient floue (un peu comme un plantage)
    je vais chercher comment éviter ça

    Mais merci beaucoup !

  7. #7
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Tant mieux si ça va dans le bon sens !
    Mais en lisant ton post précédent, je vois que tu peux traiter beaucoup de fichiers en une fois et peut-être que la collection FileNames "s'étouffe" ...

    Ne peux-tu sélectionner seulement des dossiers (qui ne contiendraient que tes fichiers à traiter), car dans ce cas on peut coder la lecture de chaque fichier, un par un, sans stocker tous leurs noms et chemins d’accès.

    Par exemple, le code suivant énumère tous les noms de fichier d'un dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim MesFichiers() As String = Directory.GetFiles("X:\MonDossier")
    Dim UnFichier As String
    For Each UnFichier In MesFichiers
        LBMaListe.Items.Add(UnFichier)  ' ici au lieu de remplir une ListBox, on peut lire le fichier et travailler avec ses données
    Next
    Note que Directory.GetFiles est aussi une collection, elle est peut-être plus efficace que FileNames, je n'en sais rien.


  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Septembre 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2019
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Salut phil !

    En fait je me suis mal exprimé, la fonction ne s'étouffe pas, le logiciel est juste en "suspend" pendant le traitement
    j'avais lu un truc qui disait qu'on pouvait se débrouiller pour faire les calculs en arrière plan pour éviter le phénomène,
    mais je t'avoue avoir dû rendre le projet assez tôt donc j'ai simplement mis le curseur en mode sablier.

    Je testerai quand même ce soir ta solution, c'est toujours cool d'optimiser les programmes.

    Encore merci à tous pour votre coup de pouce !

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Cela ne change probablement pas grand chose avec une collection de de réponses dans une boîte de dialogue, mais, si tu changes d'idée; cela peut toujours servir. Et puis comme cela va être archivé, cela peut servir à d'autres. (Comme pour les étudiants de Phil.) Directory, Files, DirectoryInfo et FileInfo ont aussi des méthodes Enumerate. Elles fonctionnent comme les méthodes Get sauf qu'elles peuvent commencer à afficher les résultats avant d'avoir tout lu les dossier. Cela peut être plus efficace principalement dans le cas de gros dossiers.

    https://docs.microsoft.com/en-us/dot...tframework-4.8

    Et cela a été ajouté avant le Framework 4,8
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  10. #10
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Merci Clement ...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/07/2010, 13h45
  2. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  3. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41
  4. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

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