Groupement fichiers puis données

Résolu
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 - Modifié le 10 mars 2022 à 21:41
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 - 23 mars 2022 à 08:21
Bonjour,
Je voudrais grouper tout les fichiers csv qui contiennent l'info tbachatdate.Text dans le nom, les lires, modifier la quantité pour les items identique et afficher dans une listview.
J'ai réussi a faire cela est ce bon pour le debut ?

format des fichier csv
instrument;couleur;quantité;;



For Each fichier As String In IO.Directory.GetFiles(Form2.cheminapprobarre.Text, "*.csv")
            Dim info As New IO.DirectoryInfo(Form2.cheminapprobarre.Text)
 
            If (fichier.IndexOf(tbachatdate.Text, StringComparison.OrdinalIgnoreCase) > 0) Then
 
                Dim listefichierbon As New List(Of String)
                listefichierbon.Add(fichier)
            Else
 
            End If
 
        Next
For Each fichierbon As String In listefichierbon
            'Lecture des fichiers
            Dim triefinal = File.ReadAllLines(fichierbon)
 
        Next

23 réponses

Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
11 mars 2022 à 09:13
Très bien.
Que tu n’aies pas tout acquis et qu’il faille pratiquer pour ça, c’est normal.
Mais au moins tu as vu les notions essentielles et tu peux retourner dans le cours en cas de doute.
Et on va pouvoir dialoguer plus efficacement.

Par contre là, je ne peux pas tester ton code maintenant.
Ce soir peut-être, mais probablement plutôt ce week-end.


Pour optimiser un peu, ici
 fichier.IndexOf(tbachatdate.Text, StringComparison.OrdinalIgnoreCase) > 0)  
utilise la méthode Contains, il y a aussi une surcharge avec laquelle tu peux indiquer d’ignorer la casse et ça fait une instruction de moins car le résultat est directement un booléen.

Par contre ni Contains, ni IndexOf ne vont fonctionner s’il y a des diacritiques différents
1
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
21 mars 2022 à 20:28
Bonsoir
Il faut créer un listviewitem, ajouter chaque élément à sa collection Subitems et ensuite l'ajouter à la listview
1
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
11 mars 2022 à 08:13
Bonjour

Avant de passer du temps sur ce nouveau problème, as tu fait l’effort de lire le cours de Tahé ?
Si oui, as tu résolu ton problème de Split?
Si oui merci de marquer le sujet résolu.
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
11 mars 2022 à 08:31
Ah oui désolé j'avais pas vu l'option pour sujet résolu
Oui j'ai lu le cours mais c'est vrai que c'est beaucoup d'info, il faut pratiquer pour bien assimiler.
J'avais du mal a comprendre le As New List maintenant je comprend l'utilité de faire un tableau a 1 ou 2 dimensions....
C'est pourquoi je veux m'entrainer sur cet exemple a lister les bon fichier a les lires et a lister le contenu et grouper
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
Modifié le 11 mars 2022 à 08:59
On peut visualiser la new list pour controler avec visual studio ?
J'ai l'impression que j'ai un bug il me regroupe pas et me modiife pas les quantités

Dim listefichierbon As New List(Of String)

        For Each fichier As String In IO.Directory.GetFiles(Form2.cheminapprobarre.Text, "*.csv")
            Dim info As New IO.DirectoryInfo(Form2.cheminapprobarre.Text)
'Controle selon critére (textbox)
            If (fichier.IndexOf(tbachatdate.Text, StringComparison.OrdinalIgnoreCase) > 0) Then
'Ajout dans la list listefichierbon
                listefichierbon.Add(fichier)
            End If

        Next
'Lecture de tout les fichiers
        For Each fichierbon As String In listefichierbon
            'Lecture du fichier
            Dim lecturefichierselectionne = File.ReadAllLines(fichierbon)

            'Récupération des informations des fichiers et ecriture dans une list contenudesfichiers 

            Dim contenudesfichiers = New List(Of objet)
            For Each item In lecturefichierselectionne
'Décompose le fichier selon carractére (;)
                Dim parts = item.Split(New Char(){";"}, StringSplitOptions.RemoveEmptyEntries)
                contenudesfichiers.Add(New objet With {.Nom = parts(0), .Couleur = parts(1),.quantite = parts(2)})
            Next
'Regroupement et comptage des objets
            Dim objets_group = contenudesfichiers _
                .GroupBy(Function(objet) New With {Key objet.Nom, Key objet.Couleur}) _
                .Select(Function(groupe) New With {.Nom = groupe.Key.Nom, .Couleur = groupe.Key.Couleur, .Nombre = groupe.Count()})

            'Affichage des fruits groupés et comptés

            For Each objet In objets_group
                achatlvcontenubarre.Items.Add($"{objet.Nom}, {objet.Couleur}, {objet.Nombre}")
            Next
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
12 mars 2022 à 12:18
Bonjour

en fait je ne peux pas essayer ton code.
La première raison est que, malgré le fait qu'on te l'ai dit plusieurs fois, tu n'as pas activé option Strict et Option Explicit. Ne pas activer ces options c'est laisser à Visual Studio le choix de faire ce qu'il veut quand tu n'as pas coder correctement et qu'il "croit" pouvoir corriger à ta place. Des fois ça marche, mais des fois non.
C'est comme le cours de Tahé, si tu veux que je continue à t'aider, tu actives ces options et tu reviens avec un code corrigé en conséquence.

La deuxième raison c'est cette ligne (entre autre)
Dim contenudesfichiers = New List(Of objet)
, d'abord nommer une classe objet n'est pas une bonne idée, un objet en vb.net ça a un sens précis. Nomme cette classe en fonction de ce qu'elle représente vraiment (il me semble en fonction de tes questions précédentes que Article serait adapté). Mais surtout tu n'as pas fourni le code de cette classe et ça pourrait être important
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
12 mars 2022 à 12:19
Ha aussi, les fichiers de test de tes questions précédentes sont ils applicables ici?
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
12 mars 2022 à 22:28
non pas identique
de la forme :
Fichier1
guitare;noire;1;;
saxo;vert;2;;

fichier2
guitare;noire;1;;
saxo;bleue;2;;
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
13 mars 2022 à 11:13
ET donc le code corrigé et la classe "objet" ?
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 08:52
Bonjour,
Si j'ai bien les options a "on" Je ne comprend pas
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
14 mars 2022 à 10:20
Ha ok.

Tu as quelle framework 4.7 ou 6 ?
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
Modifié le 14 mars 2022 à 09:14
Jusque la j'ai récupéré les noms des fichiers et la je dois les lire et les ranger pour après les regrouper c'est bien ça ?
Je regroupe bien dans le fichier mais pas sur l'ensemble des fichiers.

'Récupération des informations du fichiers

'Lecture de tout les fichiers
        For Each fichierbon As String In listefichierbon
            'Lecture du fichier
            Dim lecturefichierselectionne = File.ReadAllLines(fichierbon)

            'Récupération des informations du fichiers
Dim contenudesfichiers = New List(Of article)
            For Each item In lecturefichierselectionne
                Dim parts = item.Split(New Char(){";"}, StringSplitOptions.RemoveEmptyEntries)
                contenudesfichiers.Add(New article With {.Nom = parts(0), .Couleur = parts(1), .quantite = parts(2)})
            Next

            'Regroupement et comptage des objets
            Dim objets_group = contenudesfichiers _
                .GroupBy(Function(objet) New With {Key objet.Nom, Key objet.Couleur}) _
                .Select(Function(groupe) New With {.Nom = groupe.Key.Nom, .Couleur = groupe.Key.Couleur, .quantite = groupe.Count()})

            'Affichage des nom groupés et comptés

            For Each objet In objets_group
                achatlvcontenubarre.Items.Add($"{objet.Nom}, {objet.Couleur}, {objet.quantite}")
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 11:37
framework 4.8
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
14 mars 2022 à 12:53
C’est étonnant.
Tu utilises quel visual studio ?
Parce que cette ligne,
 Dim parts = item.Split(New Char(){";"}, StringSplitOptions.RemoveEmptyEntries) 

ne compile pas en 4.8 avec VS 2019 car tu essayes de créer un tableau de char rempli avec une string donc conversion implicite qui devrait être interdite par l’activation de Option Explicite
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 13:39
J'ai la version Visual studio 2022
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
Modifié le 14 mars 2022 à 14:56
Je viens de le rectifier je regroupe bien les noms+couleurs identique dans le fichier mais pas sur l'ensemble des fichiers. Est ce que c'est un problème de boucle mal faite j'ai un peu de mal la.
contenudesfichiers.Add(New article With {.Nom = parts(0), .Couleur = parts(1), .quantite = parts(2)})


Dim listefichierbon As New List(Of String)
        For Each fichier As String In IO.Directory.GetFiles(c:\test, "*.csv")
            Dim info As New IO.DirectoryInfo(c:\test,.Text)
            If (fichier.IndexOf(tbachatdate.Text, StringComparison.OrdinalIgnoreCase) > 0) Then
                listefichierbon.Add(fichier)
            End If
        Next

        'Lecture de tout les fichiers
        For Each fichierbon As String In listefichierbon

            'Lecture du fichier
            Dim lecturefichierselectionne = File.ReadAllLines(fichierbon)

            'Récupération des informations du fichiers
            Dim contenudesfichiers = New List(Of article)
            For Each item In lecturefichierselectionne
                Dim parts = item.Split(New String(){";"}, StringSplitOptions.RemoveEmptyEntries)
                contenudesfichiers.Add(New article With {.Nom = parts(0), .Couleur = parts(1), .quantite = parts(2)})
            Next

            'Regroupement et comptage des objets
            Dim objets_group = contenudesfichiers _
                .GroupBy(Function(objet) New With {Key objet.Nom, Key objet.Couleur}) _
                .Select(Function(groupe) New With {.Nom = groupe.Key.Nom, .Couleur = groupe.Key.Couleur, .quantite = groupe.Count()})

            'Affichage des noms groupés et comptés
            For Each objet In objets_group
                achatlvcontenubarre.Items.Add($"{objet.Nom}, {objet.Couleur}, {objet.quantite}")
            Next
        Next
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
14 mars 2022 à 16:05
Je ne sais pas, tu n’as toujours pas donné le code de la classe « objet »
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 16:58
J'ai tout refait avec pour l'instant 1 fichier

Public Class Form1

    Private Sub ok_Click(sender As Object, e As EventArgs) Handles ok.Click
        'on va lire le fichier d'un coup avec la classe File et en faire un tableau dont chaque ligne est une entrée
        Dim lignes As String() = File.ReadAllLines("C:\test\test1.csv")

        'on va créer une List de DataTrucss et la remplir     
        Dim datas As List(Of DataTrucss) = New List(Of DataTrucss)

        For Each l In lignes
            datas.Add(New DataTrucss(l))
        Next

        'regrouper les données par article et par couleur
        Dim regroupement = datas.GroupBy(Function(x) x.ToString)

        For Each groupe In regroupement
            listview1.Items.Add(New ListViewItem({groupe.First().Article, groupe.First().Couleur, groupe.Count.ToString()}))
        Next
    End Sub
End Class



Class DataTrucss
    Public Sub New(ByVal LigneCsv As String)
        Dim l As String() = LigneCsv.Split(";"c)
        Article = l(0)
        Couleur = l(1)
    End Sub

    Public Property Article As String
    Public Property Couleur As String

    Public Overrides Function ToString() As String
        Return $"{Article}, {Couleur}"
    End Function
End Class

Class DatasTriees
    Public Sub New(ByVal Combinaison As DataTrucss, ByVal LaQuantite As Integer)
        Donnee = Combinaison
        Quantite = LaQuantite
    End Sub

    '1 combinaison Article / Couleur
    Public Property Donnee As DataTrucss

    'la quantité de cette combinaison
    Public Property Quantite As Integer

    Public Overrides Function ToString() As String
        Return $"{Donnee.Article}, {Donnee.Couleur} x{Quantite}"
    End Function
End Class
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 16:59
Comment je dois faire pour plusieurs fichiers ?
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
14 mars 2022 à 17:48
Puisque maintenant tu reviens à ce que je t'avais donné au départ...
Je t'avais donné ça aussi
https://codes-sources.commentcamarche.net/forum/affich-10107359-modifier-la-quantite-si-article-et-couleur-identique?page=2#49
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
14 mars 2022 à 20:56
Désolé j'ai pas eu le temps de finir mon message je voudrais lire plusieurs fichiers mais surtout trouver une solution pour dire que l'on a déjà charger c'est fichier ou lu, ou genre un calendrier avec des points sur les dates deja charger ou autre idée.
0
Whismeril Messages postés 18286 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 mars 2023 622
14 mars 2022 à 21:02
Et bien tu regardes déjà le message de l'autre fois
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
21 mars 2022 à 10:02
Bonjour,
Avant de cloturer, comment je peux faire pour afficher nom colonne1 couleur colonne 2 et quantite colonne3 car actuelement j'affiche tout colonne1
achatlvcontenubarre.Items.Add($"{objet.Nom}, {objet.Couleur}, {objet.quantite}")
Merci
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
Modifié le 23 mars 2022 à 16:23
Merci
 Dim LVI As ListViewItem = achatlvcontenubarre.Items.Add(objet.Nom)
            LVI.SubItems.Add(objet.Couleur)
            LVI.SubItems.Add(objet.quantite)
0
trucss Messages postés 172 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 10 février 2023 1
Modifié le 22 mars 2022 à 14:51
Je viens de tester et je m'aperçois que ça n'additionne pas la quantité
Je voudrais pour chaque nom et couleur on additionne les quantitées

Dim lecturefichierselectionne = File.ReadAllLines(fichierbon)

            'Récupération des informations du fichiers
            For Each item In lecturefichierselectionne
                Dim parts = item.Split(New String(){";"}, StringSplitOptions.RemoveEmptyEntries)
                contenudesfichiers.Add(New article With {.Nom = parts(0), .Couleur = parts(1), .quantite = parts(2)})
            Next
        Next

        'Regroupement et comptage des objets
        Dim objets_group = contenudesfichiers _
                .GroupBy(Function(objet) New With {Key objet.Nom, Key objet.Couleur, Key objet.quantite}) _
                .Select(Function(groupe) New With {.Nom = groupe.Key.Nom, .Couleur = groupe.Key.Couleur, .quantite = groupe.Key.quantite})

        'Affichage des noms groupés et comptés
        For Each objet In objets_group
            Dim LVI As ListViewItem = achatlvcontenubarre.Items.Add(objet.Nom)
            LVI.SubItems.Add(objet.Couleur)
            LVI.SubItems.Add(objet.quantite)
        Next
0
Rejoignez-nous