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

bounz_56 Messages postés 11 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 22 décembre 2009 - 22 déc. 2009 à 07:33
bounz_56 Messages postés 11 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 22 décembre 2009 - 22 déc. 2009 à 23:28
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 08:52
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 09:03
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 09:19
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
0
bounz_56 Messages postés 11 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 22 décembre 2009
22 déc. 2009 à 21:11
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,
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 déc. 2009 à 22:23
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
0
bounz_56 Messages postés 11 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 22 décembre 2009
22 déc. 2009 à 23:28
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,
0
Rejoignez-nous