Extraction d'une date Mini/Maxi à partir de champ texte non standarts

Signaler
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009
-
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009
-
Bonjour à tous,

Je suis confronté à un problème pour extraire une date minimal et maximale contenu dans 2 champs texte d'une table issue d'un fichier texte !

Voici un aperçu des données (fichier texte - séparateur ";")

Numero ; Nom ; DateDeb ; HeureDeb ;Date fin ; HeureFin
1 ; toto ; 05/03 ;07h00 ;05/03 ; 10h06
2 ; TITI ; 17/03 ;07h00 ;19/03 ; 17h15
3 ; TUTU ; 02/04 ;07h00 ;02/04 ; 10h06
4 ; JEAN ; 20/04 ;07h00 ;21/04 ; 10h06
5 ; TITI ; 28/04 ;16h20 ;28/04 ; 16h50

le formatage des dates de début et de fin est de la forme : jj/mm (il n'y a pas d'année).

Le chargement dans un dataset ne pose pas de problème et des requêtes simples fonctionnent correctement directement sur le fichier CSV.

Voici un exemple pour ceux que cela intéresseraient :


Dim laconnection$ = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Nom_dossier$ & ";Extended Properties=" & Chr(34) & "text;HDR=Yes;FMT=Delimited(,)" & Chr(34)
Dim textConnection = New System.Data.OleDb.OleDbConnection(laconnection$)
textConnection.open()
dim DatatoLoad As DataSet
chemin_fichier$ = New System.IO.FileInfo(chemin_fichier$).Name
Dim selectCommand$ = "select " & critere1$ & " from " & chemin_fichier$ & critere2$
Dim textOpenCommand = New System.Data.OleDb.OleDbCommand(selectCommand$)
textOpenCommand.Connection = textConnection
Dim textDataAdapter = New System.Data.OleDb.OleDbDataAdapter(textOpenCommand)
Dim enregistrements = textDataAdapter.Fill(DatatoLoad)
dim Nombre_Trouvé as long = DatatoLoad.Tables(0).Rows.Count.ToString
textConnection.Close()
textConnection.Dispose()


Question :
Quelle est la bonne instruction SQl à écrire pour :
[list]
- extraire la date minimale des enregistrements
- extraire la date maximale des enregistrements
- éventuellement le nombre de fois où [NOM] a été trouvé dans un créneau de date
/list

Je vous remercie par avance car là, je suis un peu sec !
Bonnes fêtes à tous en tous les cas !

6 réponses

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
dingue que malgré la présence d'un balisage du code source, certains s'arrangent toujours pour qu'il soit illisible...

8 msg, tu es nouvellement actif sur le forum.
Je vais donc t'expliquer de quoi je parles.

dans la barre d'outils au dessus de la zone de saisie, tu peux voir un bouton <> (a coté du bonhomme qui parle)
ca te permet en spécifiant le language (VB) de faire ce genre de choses :

Dim laconnection$ = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Nom_dossier$ & ";Extended Properties=" & Chr(34) & "text;HDR=Yes;FMT=Delimited(,)" & Chr(34) 
Dim textConnection = New System.Data.OleDb.OleDbConnection(laconnection$) 
textConnection.open() 
dim DatatoLoad As DataSet 
chemin_fichier$ = New System.IO.FileInfo(chemin_fichier$).Name 
Dim selectCommand$ = "select " & critere1$ & " from " & chemin_fichier$ & critere2$ 
Dim textOpenCommand = New System.Data.OleDb.OleDbCommand(selectCommand$) 
textOpenCommand.Connection = textConnection 
Dim textDataAdapter = New System.Data.OleDb.OleDbDataAdapter(textOpenCommand) 
Dim enregistrements = textDataAdapter.Fill(DatatoLoad) 
dim Nombre_Trouvé as long = DatatoLoad.Tables(0).Rows.Count.ToString 
textConnection.Close() 
textConnection.Dispose()


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
Ajoutes

Option Strict On
Option Explicit On

tout en haut de ton module de code, et fais y un peu de ménage...

tu y verra surement déjà plus clair

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
J'ai fais un peu de ménage... ca va tout de suite mieux, pour comprendre, je pense... (surtout que je ne code pas en .Net, alors si là je comprend ^^)

Option Strict On
Option Explicit On

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                         "Data Source=c:\;" & _
                                         "Extended Properties=""text;HDR=Yes;FMT=Delimited"""
        Dim SQL As String = "SELECT MIN(DateDeb), MAX(DateDeb) FROM `a.csv`"
        Dim DataAdapter As OleDbDataAdapter = New OleDbDataAdapter(SQL, ConnectionString)
        Dim Data As New DataSet()
        DataAdapter.Fill(Data)

        With Data.Tables(0).Rows(0)
            MessageBox.Show(.Item(0).ToString() & " " & .Item(1).ToString())
        End With
    End Sub
End Class


J'ai du corriger le contenu de ton csv...

1 ; toto ; 2009-03-05 ;

on stocke toujours les dates de manière non ambigüe... dans ton cas il manquait mêem l'année!


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009

Bonjour Renfield,

Merci pour tes conseils sur la mise en forme.

Par contre, pour le reste, c'était juste un extrait de code qui permettait d'illustrer en autre, la chaine de connection nécessaire à ouvrir un fichier texte avec séparateur , ou ;.

En ce qui concerne ta remarque sur l'ambiguïté de la date, je n'ai pas le choix. Ce fichier provient d'une extraction où il n'est pas possible d'obtenir des dates dans un format standard. Donc, il faut considérer les champs [Date Deb] et [Date Fin] comme étant de type texte sur 5 caractères (jj/mm), l'année n'étant jamais extraite. Et c'est là que vient la difficulté pour obtenir des stats sur ces informations. Je pense à placer un conversion de texte en Date dans la requête + concaténation de l'année pour obtenir un info de type date, mais je ne connais pas la syntaxe.

Je réitère donc ma question :
Quelle est la bonne instruction SQl à écrire pour :
- extraire la date minimale des enregistrements
- extraire la date maximale des enregistrements
- éventuellement le nombre de foi où [NOM] a été trouvé dans un créneau de date

Merci d'avance,
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
cette extraction nous donne des données inutilisables de manière industrielle et efficace.
si tu ne peux rien pour le format des données extraites, ne peux tu pas remanier le fichier, avant de l'exploiter via oleDB ?

c'est aisément faisable.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009

Oui, il serait certainement préférable de "formater" les données du fichier.
- Soit en modifiant directement le fichier texte
- Soit en créant dans un 1er temps, une BDD avec champs typés et formatés, puis dans un second temps, injecter les enregistrements.

Si c'est aisément faisable, je suis preneur de tes conseils.
Cordialement,