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 :

Rech. Algo pour comparer groupes de date et concaténation des données associées


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut Rech. Algo pour comparer groupes de date et concaténation des données associées
    Bonjour à tous,

    Comme mon titre, assez long je reconnais, l’annonce, je suis à la recherche d'un algo ou quelque chose qui le ferait déjà tout seul (on sait jamais), pour comparer des bloc de dates contenant des donnés. le tout stocker actuellement dans une collection de dictionnary(Date,Double). Chaque Keys de la collection représente un fichier par le dictionnary associé.

    Exemple:

    1er fichier
    Key Donnée
    13/10/2010 15:50:00 54,48
    13/10/2010 16:00:00 54,49
    13/10/2010 16:10:00 54,30
    13/10/2010 16:20:00 54,50
    13/10/2010 16:30:00 54,52
    13/10/2010 16:40:00 54,54
    13/10/2010 16:50:00 54,48
    13/10/2010 17:00:00 54,52
    13/10/2010 17:10:00 54,55
    etc..

    2eme fichier
    Key Donnée
    13/10/2010 17:20:00 54.50
    13/10/2010 17:30:00 54.52
    13/10/2010 17:40:00 54.57
    13/10/2010 17:50:00 54.51
    13/10/2010 17:60:00 54.48
    13/10/2010 18:00:00 54.45
    13/10/2010 18:10:00 54.40
    etc...

    3eme fichier
    Key Donnée
    13/10/2010 15:00:00 54.50
    13/10/2010 15:10:00 54.52
    13/10/2010 15:20:00 54.57
    13/10/2010 15:30:00 54.51
    13/10/2010 15:40:00 54.48
    13/10/2010 15:50:00 54,48
    13/10/2010 16:00:00 54,49
    etc...

    4eme fichier
    Key Donnée
    13/12/2010 18:00:00 54.50
    13/12/2010 18:10:00 54.52
    13/12/2010 18:20:00 54.57
    13/12/2010 18:30:00 54.51
    13/12/2010 18:40:00 54.48
    13/12/2010 18:50:00 54.45
    13/12/2010 19:00:00 54.40
    etc...

    Voila un exemple.

    Ce que je souhaite c'est qu'il me reste donc uniquement 2 fichiers
    Le 4éme étant complètement en hors limite des autres cela en fait un
    et le 2éme serait une concaténation des 3 1er en éliminant les redondances.

    Je précise que je connais la date de début et de fin de chaque fichier.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'ai rien compris de ce que tu veux exactement

    si tu veux merger des dictionnaires tu peux faire du linq to object (.union ou autre from, dispo depuis fx3.5)
    mais le mieux vu que tu remplies les dictionnaires, d'en avoir qu'un rempli intelligemment à la lecture des fichiers (sauf si tu as besoin à un moment des dico distinct)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Pas très clair ton histoire... en tous cas j'ai pas du tout compris ce que tu voulais faire. Essaie d'être plus précis

  4. #4
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Je vais essayer d’être plus clair, mais d'une c'est pas simple, et d'autre je sais pas forcement trouver les mots.

    A la base j'ai des fichiers "*.csv" contenant 4 lignes d’entête pour me permettre de savoir ce que contient le fichier (nom du site, type de mesure, date de début date de fin etc...).
    Ensuite j'ai toutes les données avec la date complète puis la données de mesures associé.
    Donc:
    mon entête1
    mon entête2
    mon entête3
    mon entête4
    12/05/2011 15:14:00;54.48
    12/05/2011 15:24:00;54.50
    etc....

    J'ai plusieurs fichiers comme cela.

    Je fait mon tri avec les entêtes pour garder ceux qui m’intéresse (le nom du site et le type de mesure que j'ai besoin)

    Une fois mon 1er tri il me reste les fichiers de l'exemple que j'ai cité sur mon 1er post.

    Ensuite il faut que je fasse le tri dans les fichiers qu'il me reste en fonction des dates.

    En imaginant que la plage de date d'un fichier soit identique OU contenu dans un des autres il est inutile que je le garde. Il m'en reste donc qu'un sur les 2 en gardant celui avec la plage la plus importantes.

    En imaginant que la plage de date d'un fichier soit contiguë à un autre, on ajoute donc cette plage à l'autre, pour n'en former plus qu'un seul

    En imaginant que la plage soit complètement différent des autres on le garde donc en tant que nouvelle plage de dates.

    A la fin on a donc une ou plusieurs plage de date contiguë. L'utilisateur sélectionnera la plage qui lui conviens afin d'effectuer des statistiques dans cette plage.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si une plage A est contenue dans une plage B, que fais-tu des mesures de A faites à des temps différents de celles de B (à temps identique, j'ai compris que tu gardais la mesure de B) ?

    Dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       |t1---------PlageA-------------t3|
                               |t2---------PlageB-------------t4|
    Que fait-on :
    • une plage résultante C de t1 à t4 ?
    • ou un autre traitement ?
    Pour l'intervalle [t2,t3], gardes-tu les mesures de A ou celles de B ou celles de la plage la plus grande ?

  6. #6
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       |t1---------PlageA-------------t3|
                               |t2---------PlageB-------------t4|
    Que fait-on :
    • une plage résultante C de t1 à t4 ?
    • ou un autre traitement ?
    Dans ce cas il faut ajouter les élément de la plage B manquant à la plage A pour en faire une seule.
    Les éléments commun seront obligatoirement les mêmes (Même date/heure et même valeur de mesures), La partie commune de la plage B est donc inutile.

    Je commence a cerner le problème mais mon principal souci c'est de déterminer à partir de quand je concidére que l’intervalle entre les fichiers constitue un nouveau groupe.
    Car dans le même fichier il peut y avoir des trous. Les mesures provenant de panneau solaire, la nuit cela ne produit rien, dans ce cas dans le fichier ont aura

    15/10/2011 21:50:00 54.48
    15/10/2011 22:00:00 54.50
    15/10/2011 22:10:00 0 //- - - - - - Période de nuit
    16/10/2011 07:30:00 0 //- - - - - - 0 inséré juste avant le retour de l’énergie
    16/10/2011 07:30:01 54.39
    16/10/2011 07:40:01 54.47

    etc

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    On peut créer des listes contenant des objets avec ces données : DateTime, Mesure, FinPlage, info_en-tête

    • On trie par DateTime.
    • Parmi les enregistrements de même DateTime, on ne laisse que celui correspondant à la plage la plus grande.
    • Ensuite, on définit la plage courante avec Debut=Objet[0].DateTime et Fin=Objet[0].Fin
    • Tant que Objet[i].DateTime<=Fin : faire Fin=Max(Fin,Objet[i].Fin) et i=i+1
    • si i<Liste.count, on a Objet[i].DateTime>Fin et on enregistre la plage en cours et on en crée une nouvelle (Debut=Objet[i].DateTime et Fin=Objet[i]) et on boucle sur le "tant que".

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Est-ce que cette approche serait acceptable ?

    - prendre tous les fichiers dont les dates correspondent à la plage de dates voulue
    - lire toutes les entrées de tous ces fichiers qui sont dans la plage de dates voulue
    - éliminer les doublons

    Autrement dit, si tu as un cas comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A ----[----------------]----
    B -------[----]-------------
    Les données de B seront quand même prises en compte. Il me semble que ce ne serait pas un problème du moment qu'on élimine les doublons, non ? En tous cas ça simplifie l'approche du problème...

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    En utilisant Linq, ça pourrait donner un truc comme ça :

    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
    Sub Main()
        Dim directory As String = "C:\Data"
        Dim minDate As DateTime = new DateTime(2011, 10, 1)
        Dim maxDate As DateTime = new DateTime(2011, 11, 1)
     
        For Each d As DataRecord In GetDataForDateRange(directory, minDate, maxDate)
            ' Faire ce que tu veux avec les données
        Next
    End Sub
     
    Structure DataRecord
     
        Public Property Timestamp As DateTime
        Public Property Value As Double
     
        Public Shared Function Parse(ByVal s As String) As DataRecord
            Dim d As New DataRecord()
            Dim parts As String() = s.Split(";"c)
            d.Timestamp = DateTime.ParseExact(parts(0), "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
            d.Value = Double.Parse(parts(1), CultureInfo.InvariantCulture)
            Return d
        End Function
     
    End Structure
     
    Function GetDataForDateRange(ByVal directory As String, ByVal minDate As DateTime, ByVal maxDate As DateTime) As IEnumerable(Of DataRecord)
        Dim allData =
            From file In GetFilesForDateRange(directory, minDate, maxDate)
            From d In ReadDataFromFile(file)
            Where d.Timestamp >= minDate AndAlso d.Timestamp <= maxDate
            Order By d.TimeStamp
            Select d
     
        return allData.Distinct()
    End Function
     
    Function GetFilesForDateRange(ByVal directory As String, ByVal minDate As DateTime, ByVal maxDate As DateTime) As IEnumerable(Of String)
        ' TODO : lister les fichiers qui correspondent aux dates voulues
    End Function
     
    Function ReadDataFromFile(ByVal fileName As String) As IEnumerable(Of DataRecord)
        Return File.ReadAllLines(fileName) _
                   .Skip(4) _
                   .Select(AddressOf DataRecord.Parse)
    End Function

  10. #10
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Est-ce que cette approche serait acceptable ?

    - prendre tous les fichiers dont les dates correspondent à la plage de dates voulue
    - lire toutes les entrées de tous ces fichiers qui sont dans la plage de dates voulue
    - éliminer les doublons

    Autrement dit, si tu as un cas comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A ----[----------------]----
    B -------[----]-------------
    Les données de B seront quand même prises en compte. Il me semble que ce ne serait pas un problème du moment qu'on élimine les doublons, non ? En tous cas ça simplifie l'approche du problème...
    Pour ce cas oui on peut les rentrer mais vu que c'est des doublons il saute OUI.
    Ce que j'ai fait c'est que les données complètes je les est rentrées dans un dictionnaire avec la date comme clef. Avant d’insérer une nouvelle données je regarde si elle est déjà présente, si oui ont ne l'ajoute pas de toute manière se serait la même donc pas de souci.

  11. #11
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par tomlev Voir le message
    En utilisant Linq, ça pourrait donner un truc comme ça :

    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
    Sub Main()
        Dim directory As String = "C:\Data"
        Dim minDate As DateTime = new DateTime(2011, 10, 1)
        Dim maxDate As DateTime = new DateTime(2011, 11, 1)
     
        For Each d As DataRecord In GetDataForDateRange(directory, minDate, maxDate)
            ' Faire ce que tu veux avec les données
        Next
    End Sub
     
    Structure DataRecord
     
        Public Property Timestamp As DateTime
        Public Property Value As Double
     
        Public Shared Function Parse(ByVal s As String) As DataRecord
            Dim d As New DataRecord()
            Dim parts As String() = s.Split(";"c)
            d.Timestamp = DateTime.ParseExact(parts(0), "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
            d.Value = Double.Parse(parts(1), CultureInfo.InvariantCulture)
            Return d
        End Function
     
    End Structure
     
    Function GetDataForDateRange(ByVal directory As String, ByVal minDate As DateTime, ByVal maxDate As DateTime) As IEnumerable(Of DataRecord)
        Dim allData =
            From file In GetFilesForDateRange(directory, minDate, maxDate)
            From d In ReadDataFromFile(file)
            Where d.Timestamp >= minDate AndAlso d.Timestamp <= maxDate
            Order By d.TimeStamp
            Select d
     
        return allData.Distinct()
    End Function
     
    Function GetFilesForDateRange(ByVal directory As String, ByVal minDate As DateTime, ByVal maxDate As DateTime) As IEnumerable(Of String)
        ' TODO : lister les fichiers qui correspondent aux dates voulues
    End Function
     
    Function ReadDataFromFile(ByVal fileName As String) As IEnumerable(Of DataRecord)
        Return File.ReadAllLines(fileName) _
                   .Skip(4) _
                   .Select(AddressOf DataRecord.Parse)
    End Function
    Je ne connais pas la fonction Linq (enfin de nom si mais jamais utilisé) faut que je regarde sa.

    En ce qui concerne les fichiers c'est pas facile a expliqué ce que j'ai déjà fait donc voila dans quoi je les stock:
    Classe Collection de site
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    Public Class clsCollectionSite
    #Region "Champs privés"
        Private _IdSite As String                       'Nom du site
        Private _NomFichier As String                   'Nom du fichier
        Private _Path As String                         'Chemin complet pour acceder au fichier
        Private _Indice As String                       'Indice du fichier (inutile actuellement)
        Private _Mesure As String                       'Nom de la mesure
        Private _Unit As String                         'Unite de la mesure
        Private _DateDeb As String                      'Date de debut du fichier
        Private _DateDebNum As Double                   'Date de debut du fichier sous forme numérique (inutile actuellement)
        Private _DateFin As String                      'Date de fin du fichier
        Private _DateFinNum As Double                   'Date de fin du fichier sous form numérique (inutile actuellement)
        Private _Donnee As Dictionary(Of Date, Double)  'Dico La date/heure et la valeur de la mesure
        Private _Retenu As Boolean                      'Si le fichier est gardé (Bon site et Bonne mesure)
        Private _Lot As Long                            'Pour identifier dans quelle plage horaire il est. Pour la gestion des différentes plage horaire dispo
        Private _Interval As Integer                    'Interval de temps entre chaque mesure en minutes
     
    #End Region
    #Region "Constructeur"
        Sub New()
            _IdSite = ""
            _NomFichier = ""
            _Path = ""
            _Indice = ""
            _Mesure = ""
            _Unit = ""
            _DateDeb = ""
            _DateDebNum = 0
            _DateFin = ""
            _DateFinNum = 0
            _Donnee = New Dictionary(Of Date, Double)
            _Retenu = True
            _Lot = 0
            _Interval = 0
        End Sub
    #End Region
    #Region "Propriétés publiques"
        Property IdSite() As String
            Get
                Return _IdSite
            End Get
            Set(ByVal value As String)
                _IdSite = value
            End Set
        End Property
        Property NomFichier() As String
            Get
                Return _NomFichier
            End Get
            Set(ByVal value As String)
                _NomFichier = value
            End Set
        End Property
        Property Path() As String
            Get
                Return _Path
            End Get
            Set(ByVal value As String)
                _Path = value
            End Set
        End Property
        Property Indice() As String
            Get
                Return _Indice
            End Get
            Set(ByVal value As String)
                _Indice = value
            End Set
        End Property
        Property Mesure() As String
            Get
                Return _Mesure
            End Get
            Set(ByVal value As String)
                _Mesure = value
            End Set
        End Property
        Property Unit() As String
            Get
                Return _Unit
            End Get
            Set(ByVal value As String)
                _Unit = value
            End Set
        End Property
        Property DateDeb() As String
            Get
                Return _DateDeb
            End Get
            Set(ByVal value As String)
                Dim dt As Date
                _DateDeb = value
                dt = _DateDeb
                _DateDebNum = dt.ToOADate
            End Set
        End Property
     
        Property DateDebNum() As Double
            Get
                Return _DateDebNum
            End Get
            Set(ByVal value As Double)
                Dim dt As Date
                _DateDebNum = value
                dt = Convert.ToDateTime(_DateDebNum)
                _DateDeb = Format(dt, "dd/MM/yyyy hh:mm:ss")
            End Set
        End Property
        Property DateFin() As String
            Get
                Return _DateFin
            End Get
            Set(ByVal value As String)
                Dim dt As Date
                _DateFin = value
                dt = _DateFin
                _DateDebNum = dt.ToOADate
            End Set
        End Property
        Property DateFinNum() As Double
            Get
                Return _DateFinNum
            End Get
            Set(ByVal value As Double)
                _DateFinNum = value
            End Set
        End Property
        Property Donnee() As Dictionary(Of Date, Double)
            Get
                Return _Donnee
            End Get
            Set(value As Dictionary(Of Date, Double))
                _Donnee = value
            End Set
        End Property
        Property Retenu() As Boolean
            Get
                Return _Retenu
            End Get
            Set(value As Boolean)
                _Retenu = value
            End Set
        End Property
        Property Lot() As Long
            Get
                Return _Lot
            End Get
            Set(value As Long)
                _Lot = value
            End Set
        End Property
        Property interval() As Integer
            Get
                Return _Interval
            End Get
            Set(value As Integer)
                _Interval = value
            End Set
        End Property
    #End Region
    End Class
    il y a surement quelques erreurs dedans notamment pour la conversion de dates mais j'en ai peut être pas besoin.

    Je stock sa dans un autre dictionnaire pour chaque site

    Dico(of String, clsCollectionSite)

    Avec comme clef le nom du fichier, et les données dans clsCollection Site


    Dans ClsCollectionSite, il y a un autre dico qui lui va contenir les mesures avec comme clef la date. Je rempli cette partie uniquement pour le nom du site sélectionné ET la mesure sélectionné. Les autre restant vide, inutile de lire l’intégralité de tous des fichiers "*.csv"


    Voila par exemple comment j'affiche dans une listBox toutes les données mais sans le contrôle des dates:
    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 Fichier As New clsFichiers()                                 ' c'est ce la classe qui gère la lecture des fichiers
            Dim Dic As New Dictionary(Of String, clsCollectionSite) 
            NomMesure = ListBox1.Items(ListBox1.SelectedIndex)    'Nom de la mesure selectionné par l'utilisateur dans la listBox
            Dic = Fichier.ListeSelection(NomSite, NomMesure) 
     
     
            If Dic.Count > 0 Then
                ListBox1.Items.Clear()
                For Each Name As String In Dic.Keys
                    If Dic(Name).Retenu then
                        For Each Dat As Date In Dic(Name).Donnee.Keys
     
                            ListBox1.Items.Add(Format(Dat, "dd/MM/yyyy hh:mm:ss") & "-" & CStr(Dic(Name).Donnee(Dat)))
                        Next
     
                    End If
                Next
            End If

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    par défaut le compilateur vb laisse écrire n'importe quoi car beaucoup de débutants se tournent vers ce langage
    néanmoins on peut le paramétrer pour qu'il soit comme le compilateur de c# à savoir n'autoriser que du code propre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set (value as string)
    Dim dt As Date
    _DateFin = value
    dt = _DateFin
    tu mets un string dans une date, en programmation, on ne met pas un chou dans une carotte (éventuellement, un chou dans un légume)
    dans les propriétés du projet / onglet compiler, mettre option explicite et option strict sur ON
    ca va te souligner tout ce qui ne se fait pas

    après sur l'exposition de la date en string, c'est moyen, ce qui serait conseillé ca serait d'exposer des propriété readonly dans le type qu'elles doivent être, et avoir un sub new paramétré qui demande toutes les valeurs (une date as string ici si tu veux)
    tu remplis alors les champs privés que les propriétés retourneront

    concernant linq to object, ca sert surtout à réduire le nombre de lignes, bien souvent ca équivaut à un for each avec un traitement


    je retente un truc, n'ayant pas pris le temps de tout comprendre
    si tu as dico1 et dico2 (date, double) et que tu veux en résultat un dico avec des dates uniques en mettant le tout dans dico1


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for each d as date in dico2.keys
      if not dico1.containskey(d) then
        dico1.add(d,dico2(d))
      end if
    next
    tout ce qui est dans dico2 et qui n'est pas déjà dans dico1 sera ajouté dans dico1
    le résultat ne sera pas trié mais ca reste simple à faire

  13. #13
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Merci de souligner mes erreurs, comme tu l'a compris je suis débutant, de 40 ans mais débutant, après une formation BTS IRIS l'année dernière, pour changer de vie. Électricien indus (20 ans) -> info indus. Désoler pour les fautes d’orthographe d'ailleurs, mais 20 ans à être un légume cela laisse des traces, mais je me soigne

    J'ai pas le code sous les yeux car c’était au boulot mais j'ai fait le même principe que sa pour l'ajout de données dans une collection et éviter les doublons grâce à la clef.
    En ce qui concerne le Link j'avais vu sa quand j'ai fait du XML, j'ai utilisé Xpath et XMLDocument, mais j'avais vu un peut le Link, sans l'utiliser.

    Mais bon, pour mon souci de trouver les VRAIS trous entre 2 enchaînements de dates j'ai des pistes.

    Par exemple lorsque j'ai un trou pour une période contigu, j'ai toujours 2 valeurs à 0

    15/10/2011 21:50:10 54.48
    15/10/2011 22:00:10 54.50
    15/10/2011 22:10:10 0 //- - - - - - Période de nuit
    16/10/2011 07:30:27 0 //- - - - - - 0 inséré 1 seconde juste avant le retour de l’énergie (Construction du fichier)
    16/10/2011 07:30:28 54.39 // - - - Le top qu'il m'envoie au retour de l’énergie (construction du fichier)
    16/10/2011 07:40:28 54.47

    Donc le 2éme 0 est suivi d'une autre valeur à 1 seconde

    Si j'ai un fichier qui se termine par des 0 et que l'autre reprend avec aussi des 0 ils seront espacé de l’intervalle de temps constant (ici 10 minutes) et non pas 1 seconde. Donc automatiquement pour moi c'est une nouvelle plage qui commence, si l'espace entre le dernier 0 du 1er fichier et le 1er 0 du 2eme et aussi avec un temps supérieur à la durée de l’intervalle de 10 minutes des 2 fichiers
    Pas facile à digérer ces explications je l'admet.

    EXEMPLE en aillant ajouter au dictionnaire toutes les données compatible (nom de site et mesure), en éliminant les redondants et trie du dico pour mettre les Keys (Date) dans l'ordre

    X = une valeur différente de 0

    XXXXXXXXXXX00XXXXXXXXXXXXXXXXXX

    Si le 2éme 0 est suivi 1 seconde plus tard par une autre valeur cela appartient au même fichier donc je continue de l'ajouter dans le 1er groupe de date disponible.

    Maintenant je continue

    XXXXXXXXXXX00XXXXXXXXXXXXXXXXXXXXXXXXX00XXXXXXXX

    Si par contre le 4éme 0 est suivit pas l'interval classique (ici 10 minutes) ce sera le début d'un nouveaux groupe de dates

    Donc 1er group = XXXXXXXXXXX00XXXXXXXXXXXXXXXXXXXXXXXXX0
    2éme group = 0XXXXXXXX

    l'utilisateur choisira ensuite le groupe qu'il souhaite visualiser.



    Pour donnée une idée de la construction des fichiers. Avec le logiciel de gestion de la supervision.

    Lorsque je télécharges les données de la supervision. Cette dernière me donne l’intervalle entre les données.
    ensuite elle me donne une date complète. (le top départ)
    et ensuite les données ligne par ligne

    Elle me redonne un top horloge suivi d'une valeur différente de 0 pour se resynchroniser.
    Si elle me donne un top horloge suivi d'un 0, c'est que la supervision ne mesure plus d’énergie (la nuit par exemple).
    Lorsqu'elle mesure à nouveau quelques chose, au petit matin, il me redonne un top horloge, suivit d'une valeur <> 0.
    Dans ce cas je prend la date/heures, j’enlève 1 seconde et j'ajoute au fichier cette nouvelle date moins la seconde puis 0 en valeur. j'ajoute ensuite la nouvelle date avec sa valeur.

    A la base ces fichiers servaient uniquement à tracer des courbes (d'ou l'ajout du 0 une seconde avant le retour de énergies pour que la courbe reste bien à 0 entre les 2 points). Maintenant il faut faire des stats.


    Bon je verrais sa lundi, et profité de mon week-end à faire du C++ pour programmer mon Arduino (Gestion de mon aquarium recifal).


    Une petite question en passant, en espérant que se soit possible facilement, l'ordre de lecture des fichiers dans le répertoire est pour le moment en tout cas indépendant de ma volonté.

    par exemple il peut y avoir des noms de fichiers:

    Mon Site_1.log
    Mon Site_2.log
    Mon Site_3.log
    ...
    Mon Site_10.log
    Mon Site_11.log
    Le Voisin_1.log
    Le Voisin_2.log
    etc....

    Le nom du site suivi d'un indice.
    Lors de la lecture ils sont lu pas forcement dans l'ordre et donc si je crée mon dictionnaire en éliminant les valeurs redondante, elle ne seront pas forcement dans l'ordre.

    Y a t'il un moyen de trier le dictionnaire en fonction des Keys qui sont des dates?


    merci en tout cas pour votre soutien.

Discussions similaires

  1. [VxiR2] Webi : récupérer la date de rafraîchissement des données
    Par Yochi42 dans le forum Webi
    Réponses: 10
    Dernier message: 05/07/2012, 11h29
  2. Macro pour rechercher un fichier xls et importer des données
    Par ThSPB dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2011, 16h03
  3. Date de modification des données d'une table
    Par DemonSurf dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/09/2009, 14h40

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