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

Modélisation Discussion :

Importer des données depuis un fichier texte [AC-2003]


Sujet :

Modélisation

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut Importer des données depuis un fichier texte
    Bonjour,
    je dispose de plusieurs dizaines de fichiers texte dans lesquels sont inscrits des milliers de mesures par des capteurs.
    Le format des fichiers texte se présente comme suit :
    4 colonnes (temps, Min, Max, Moyenne) répétées 240 fois (il y a 240 capteurs) et plusieurs milliers de lignes(une ligne toutes les 17 secondes).

    J'aimerai créer une table par capteur (soit 240 tables ) avec dans chaque table les colonnes Temps, Min, Max et Moyenne. Il faut donc que pour chaque fichier texte je puisse récupérer les 4 colonnes correspondantes au capteur. J'ai essayé d'importer un fichier texte dans access : premier problème, mon fichier texte est trop large (240*4 colonnes!). Y a-t-il une solution avec access?

    Une fois le fichier texte importer (appelons le Table1), j'aimerai donc créer 240 tables, sélectionner les colonnes appropriées dans Table1 et les coller dans l'une des 240 tables.
    Je suis débutant sur access. Est-ce possible de faire ceci seulement avec des requêtes sql (je connais le langage ) ou dois-je utiliser VBE (je ne connais pas du tout le langage et les fonctions ) ? Comme il y a beaucoup de fichiers texte et beaucoup de tables, j'aimerai "automatiser" au maximum le traitement des données.

    Merci d'avance pour tous vos conseils.

    Even

  2. #2
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    hello
    c'est bien possible, mais à mon sens, uniquement en VBA, le programme devrait être assez court
    par contre, je te conseille de tout mettre dans une seule table:
    N°capteur,temps, Min, Max, Moyenne
    ça sera beaucoup plus simple à manipuler et tu retrouvera par requête simple, le capteur de ton choix
    à plus pour les détails du VB

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    OK, merci bien du conseil! je vais m'atteler au langage VBA alors.

    Et concernant le trop grand nombre de colonnes de mon fichier texte, est-ce possible de l'importer en totalité? ou dois-je, lors de l'importation, décocher les (240*4)-4 soit 956 colonnes qui ne m'intéressent pas?

  4. #4
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    en programmation, on va lire des enregistrements (d'une certaine longueur) ou des lignes complètes input ou line input
    à toi de nous dire quelle est la forme du fichier texte, est ce que le nombre de chiffres est toujours le même ou pas? y a t il des séparateurs, genre ; ou , ou seulement un espace?
    exemple de programmation: (j'ai mis le chemin dans ma table de paramêtres...)
    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
    Dim bidon As String 'texte pour lecture à vide
    lieu_passage = DLookup("texte", "Parametres", "variable like 'lieu_échange'")
     
     
    DoCmd.SetWarnings False
    '
    ' Transfert des xxxxxxxxxxxx
    '
    nom_fich = lieu_passage & "acc_ascl.csv"
    nom_fich_old = lieu_passage & "acc_ascl_old.csv"
    If Len(Dir(nom_fich)) > 0 Then 'pour vérifier la présence du fichier
        Open nom_fich For Binary Access Read Lock Read As #1
        Line Input #1, bidon 'on lit la ligne de textes de titres et on s'en fout
    'on va utiliser partiellement cette table pour éviter d'en créer une nouvelle, on la vide au paragraphe suivant
        DoCmd.RunSQL "Delete * from tempo"
        Set rs_fich = CurrentDb.OpenRecordset("tempo")
        With rs_fich
        Do
            .AddNew
            bidon = Input(1, #1) 'pour pouvoir lire le EOF qui suit le CrLf à la fin du fichier
            If EOF(1) Then Exit Do
            .Fields("CLIENT") = Input(7, #1)
            bidon = Input(3, #1) ' lecture de ";"
            .Fields("CHIFF AFFAIRES") = Input(7, #1)   ' on range dans la colonne CA 
            bidon = Input(3, #1) ' lecture de " Cr Lf
            On Error Resume Next
            .Update
        Loop Until EOF(1)
        Close #1
        .Close
        If Len(Dir(nom_fich_old)) > 0 Then Kill nom_fich_old
        FileCopy nom_fich, nom_fich_old
        Kill nom_fich
    End With
    End If
    dans ce prog, je ne fais qu'ouvrir un fichier .csv, le lire, et assigner les valeurs lues à un recordset (une table 'tempo')
    à l'intérieur de ce programme, on peut bien gérer une boucle sur les 240x4 valeurs et traiter les caractères lus comme on veut
    on peut rajouter le N° de capteur, le rang de la lecture, etc...

    à bientôt

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bonjour!
    Merci beaucoup pour tes informations.

    J'ai lu quelques tutoriels du langage VBA mais je n'arrive tout de même pas à comprendre ton code. J'ai remarqué que dans des sujets similaires sur le forum, les messages parlaient souvent de la fonction "DoCmd.TransferText acImportDelim" mais je n'arrive pas à comprendre la syntaxe ni le sens des différents arguments.

    Mes fichiers texte sont de la forme suivante :

    Séparateur : tabulation

    1ère colonne : nombre réel représentant le nombre de secondes écoulées depuis le 01/01/1904 00:00:00 jusqu'au moment de l'acquisition de la mesure : exemple : 3343737137.0650 (toujours 4 chiffres après la virgule)
    2ème,3ème et 4ème colonne : un réel :exemple : 18.5857 (toujours 4 chiffres après la virgule)
    Les 4 colonnes sont répétées 240 fois ( donc la 5ème est du même type que la première).
    Le nombre de lignes est différent pour chaque fichier texte.

    Je ne suis pas feignant mais il y a vraiment beaucoup de tutoriels et je n'arrive même pas à voir lesquels se rapprochent de mon projet. Est-ce que ceux du thème "Accès aux données ==> Avec Requêtes; Avec DAO; Avec ADO" etc sont intéressants pour moi?

    Dans tous les cas merci pour les efforts que vous faites!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu ne pourras jamais mettre autant de colonne dans une table Access, la limite est de 250.

    Il faut décomposer le tout en plusieurs tables.

    Philippe

  7. #7
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    bonjour à tous
    désolé Philippe mais pour le coup, je pense à une table à 6 colonnes:
    N°capteur (en espérant qu'ils soient toujours dans le même ordre)
    Temps
    min
    max
    moyenne

    ce qui permet bien de retrouver toutes les mesures dans une seule table....

    la commande TransfertText (pour laquelle, on pourrait te donner des explications et des exemples) ne peut traiter ton cas, fichier texte trop large, trop de colonnes, etc

    par contre rien n'interdit d'ouvrir le fichier par open "fichier" as #1
    et de lire les caractères l'un après l'autre, puis ensuite de traiter cette lecture comme bon nous semble

    Je serais preneur d'un exemple tronqué (juste 5 capteurs et 10 lignes) pour vérifier la faisabilité
    Autre info: quelle est la taille globale de tes fichiers texte? si >2Go alors problème....

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bonjour,

    Les numéros de capteur sont toujours dans le même ordre donc c'est déjà un bon point

    La taille des fichiers va de moins de 1mo à 200Mo donc je pense qu'il n'y aura pas de soucis de ce côté là.
    Voici un morceau de mes fichiers texte, 5 colonnes, 10 lignes. Les séparateurs sont des tabulations.

    3346395405.4965 7.3234 -7.1558 -0.0032 3346395405.4965
    3346395473.7625 7.3234 -7.1558 0.023 3346395473.7625
    3346395542.0285 7.1726 -7.3066 0.0278 3346395542.0285
    3346395610.2944 7.1726 -7.1558 -0.0418 3346395610.2945
    3346395678.5604 5.966 -5.9492 0.018 3346395678.5604
    3346395746.8264 7.1726 -7.005 0.0074 3346395746.8264
    3346395815.0924 6.8709 -6.4017 0.0118 3346395815.0924
    3346395883.3584 6.1168 -5.9492 0.0415 3346395883.3584
    3346395951.6244 5.966 -5.9492 0.0191 3346395951.6244
    3346396019.8903 5.966 -5.9492 0.046 3346396019.8904

    Merci pour toutes vos infos! J'avance lentement mais au moins j'avance!!!

  9. #9
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    petit prog à venir d'ici 2 à 3 jours

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    En algo, le programme que je voudrais réaliser ressemblerait à ça :

    Ouverture d'une boîte de dialogue où on rentre l'adresse du fichier texte
    Récupération de l'adresse du fichier
    Ouverture du fichier
    Compter le nombre de lignes = N
    Pour i allant de 0 à 239 :
    Mettre i+1 dans le champ Numéro_de_Capteur sur N lignes dans la Table Mesures
    Mettre la colonne 4*i+1 dans le champ Temps dans la table Mesures
    Mettre la colonne 4*i+2 dans le champ Max dans la table Mesures
    Mettre la colonne 4*i+3 dans le champ Min dans la table Mesures
    Mettre la colonne 4*i+4 dans le champ Moyenne dans la table Mesures
    Fin de la procédure
    Fin du programme

  11. #11
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    à la programmation, je me rends compte que pour tester un peu j'ai besoin de 5 capteurs soit 20 colonnes
    De plus, pour dimensionner les tables au mieux, il est utile de savoir quelles sont les grandeurs mesurées: à combien peut monter le max, on ne prendra pas les mêmes types de données si max = 10 ou si max = 100000000000
    le coeur du prog devrait tenir en quelques lignes

    edit: j'ai oublié de demander en quelle version tu veux la base: mdb ou accdb, version avant Access 2007 ou après?

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bonjour,
    les grandeurs mesurées sont de trois types : capteur de déformation, capteur de déplacement, capteur de force. Du coup les valeurs sont très variables mais pour l'ensemble des capteurs les valeurs sont comprises dans l'intervalle [-10000;+10000] que ce soit, pour le Max, le Min et donc la Moyenne.
    Pour le Temps la plus faible valeur est : 3343737137.0650
    Et la valeur la plus grande est : 3385971836.3509
    Comme la base de données peut être complétée si d'autres mesures sont effectuées, la valeur la plus grande du Temps est susceptible de changer.

    J'utilise Access 2003 et enregistre ma base de données en .mdb

    Je joint un petit fichier de mesures si tu veux faire des tests sur ton code.

    Merci encore pour tous vos conseils et vos efforts!
    Fichiers attachés Fichiers attachés

  13. #13
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    hello
    SVP
    j'ai besoin de 5 capteurs soit 20 colonnes
    programme dispo dès ce soir

  14. #14
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    commence bien par fixer le nb de capteur de ton fichier texte
    normalement, je livre mes bases sans mode d'emploi
    Simplifi est un peu synonyme d'intuitif

    A plus
    Fichiers attachés Fichiers attachés

  15. #15
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    pour ceux qui ne veulent pas charger la base j'aurais pu mettre le VB pour montrer le programme
    j'ai seulement mis trois boutons sur le formulaire de démarrage:
    farfouiller (équivalent de browse) pour chercher le fichier de mesures
    charger pour le mettre dans la table
    voir pour visualiser le tableau d'un capteur et/ou celui des 240 capteurs à un moment donné
    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
     
    Private Sub Charger_Click()
    Dim Car As String, Chaîne As String, Demi_Date As Date, Date_Mesure As Date
    Dim Rst As DAO.Recordset
    If Len(Dir(Répertoire & Fichier)) > 0 Then
        Open Répertoire & Fichier For Input As #1
    End If
    Set Rst = CurrentDb.OpenRecordset("Table_Mesures")
    With Rst
    Do
        Do Until Car = vbTab
        On Error GoTo Sortie
        Car = Input(1, #1)
        Chaîne = Chaîne & Car
        Loop
        Demi_Date = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), #1/1/1904#)
        Date_Mesure = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), Demi_Date)
        For i = 1 To NbCapteurs
            .AddNew
            .Fields(0) = i
            .Fields(1) = Date_Mesure
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                Chaîne = Chaîne & Car
            Loop
           .Fields(2) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                Chaîne = Chaîne & Car
            Loop
            .Fields(3) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                If Car = Chr(13) Then Exit Do
                Chaîne = Chaîne & Car
            Loop
            .Fields(4) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            .Update
        Next i
    Loop
    Sortie:
    End With
    Close #1
    End Sub
     
    Private Sub Farfouiller_Click()
    If IsNull(Répertoire) Then
        Répertoire = OuvrirUnFichier(Me.Hwnd, "Où est le ficher contenant les enregistrements?", 1)
        Répertoire = Left(Répertoire, Len(Répertoire) - Len(Dir(Répertoire)))
        Fichier = Dir(Répertoire)
    Else
        Répertoire = OuvrirUnFichier(Me.Hwnd, "Où est le ficher contenant les enregistrements?", 1, , , Répertoire)
        Répertoire = Left(Répertoire, Len(Répertoire) - Len(Dir(Répertoire)))
        Fichier = Dir(Répertoire)
    End If
    End Sub
     
    Private Sub Fichier_DblClick(Cancel As Integer)
    Farfouiller_Click
    End Sub
     
    Private Sub Répertoire_DblClick(Cancel As Integer)
    Farfouiller_Click
    End Sub
     
    Private Sub Voir_Click()
    If Temps_sélectionné > 0 Then
        DoCmd.OpenQuery "Un_temps"
        DoCmd.MoveSize 1000, 0, 3000, 6000
    End If
    If Capteur_sélectionné > 0 Then
        DoCmd.OpenQuery "Un_capteur"
        DoCmd.MoveSize 4000, 0, 3000, 6000
    End If
    End Sub
    et puis un module (merci developpez.net)
    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
    Option Compare Database
    Option Explicit
     
     'Déclaration de l'API
     'Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
     
     'Structure du fichier
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
     'Constantes
    Private Const OFN_READONLY = &H1
    Private Const OFN_OVERWRITEPROMPT = &H2
    Private Const OFN_HIDEREADONLY = &H4
    Private Const OFN_NOCHANGEDIR = &H8
    Private Const OFN_SHOWHELP = &H10
    Private Const OFN_ENABLEHOOK = &H20
    Private Const OFN_ENABLETEMPLATE = &H40
    Private Const OFN_ENABLETEMPLATEHANDLE = &H80
    Private Const OFN_NOVALIDATE = &H100
    Private Const OFN_ALLOWMULTISELECT = &H200
    Private Const OFN_EXTENSIONDIFFERENT = &H400
    Private Const OFN_PATHMUSTEXIST = &H800
    Private Const OFN_FILEMUSTEXIST = &H1000
    Private Const OFN_CREATEPROMPT = &H2000
    Private Const OFN_SHAREAWARE = &H4000
    Private Const OFN_NOREADONLYRETURN = &H8000
    Private Const OFN_NOTESTFILECREATE = &H10000
     
    Private Const OFN_SHAREFALLTHROUGH = 2
    Private Const OFN_SHARENOWARN = 1
    Private Const OFN_SHAREWARN = 0
     
     
    Public Function OuvrirUnFichier(Handle As Long, _
                                    Titre As String, _
                                    TypeRetour As Byte, _
                                    Optional TitreFiltre As String, _
                                    Optional TypeFichier As String, _
                                    Optional RepParDefaut As String) As String
     'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir
     'la boîte de dialogue de sélection d'un fichier.
     'Explication des paramètres
        'Handle = le handle de la fenêtre (Me.Hwnd)
        'Titre = Titre de la boîte de dialogue
        'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
            '1 = Chemin complet + Nom du fichier
            '2 = Nom fichier seulement
        'TitreFiltre = Titre du filtre
            'Exemple: Fichier Access
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'TypeFichier = Extention du fichier (Sans le .)
            'Exemple: MDB
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'RepParDefaut = Répertoire d'ouverture par defaut
            'Exemple: C:\windows\system32
            'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
     
    Dim StructFile As OPENFILENAME
    Dim sFiltre As String
     
     'Construction du filtre en fonction des arguments spécifiés
    If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
      sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
    End If
    sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
     
     
     'Configuration de la boîte de dialogue
      With StructFile
        .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
        .hwndOwner = Handle 'Identification du handle de la fenêtre
        .lpstrFilter = sFiltre 'Application du filtre
        .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
        .nMaxFile = 254 'Taille maximale du fichier
        .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
        .nMaxFileTitle = 254  'Taille maximale du nom du fichier
        .lpstrTitle = Titre 'Titre de la boîte de dialogue
        .flags = OFN_HIDEREADONLY  'Option de la boite de dialogue
     
        'indique le repertoire par défaut
        If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
            RepParDefaut = CurrentDb.Name
        Else
            .lpstrInitialDir = RepParDefaut
        End If
      End With
     
    If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
        Select Case TypeRetour
          Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
          Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
        End Select
    End If
     
    End Function

  16. #16
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Avec mes excuses, j'avais pas vu le fichier Excel en réponse à la demande de 5 capteurs et j'en ai bricolé 1,
    par contre j'ai bricolé comme si le stemps n'était là qu'une seule fois au début de chaque ligne
    je vais donc modifier légèrement le VB

    edit: le voilà, seule la routine charger a changée
    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
    Private Sub Charger_Click()
    Dim Car As String, Chaîne As String, Demi_Date As Date, Date_Mesure As Date
    Dim Rst As DAO.Recordset
    If Len(Dir(Répertoire & Fichier)) > 0 Then
        Open Répertoire & Fichier For Input As #1
    End If
    Set Rst = CurrentDb.OpenRecordset("Table_Mesures")
    With Rst
    Do
        For i = 1 To NbCapteurs
            .AddNew
            .Fields(0) = i
            Do Until Car = vbTab
                On Error GoTo Sortie
                Car = Input(1, #1)
                Chaîne = Chaîne & Car
            Loop
            Demi_Date = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), #1/1/1904#) 'ajout de la date en deux fois car dépassement de capacité
            Date_Mesure = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), Demi_Date)
            .Fields(1) = Date_Mesure
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                Chaîne = Chaîne & Car
            Loop
           .Fields(2) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                Chaîne = Chaîne & Car
            Loop
            .Fields(3) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            Do Until Car = vbTab
                Car = Input(1, #1)
                If Car = Chr(13) Then Exit Do
                Chaîne = Chaîne & Car
            Loop
            .Fields(4) = CDbl(Replace(Chaîne, ".", ","))
            Chaîne = ""
            Car = ""
            .Update
        Next i
    Loop
    Sortie:
    End With
    Close #1
    End Sub

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bonjour!
    Merci beaucoup! C'est génial, ça fonctionne!
    C'était bien au dessus de mes capacités de débutants!

    Quelle est la modification à apporter dans la routine charger pour ne s'occuper que des 156 premiers capteurs?

  18. #18
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    aucune modification de programmation
    il suffit de taper 156 dans le formulaire à NbCapteurs

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Re!


    Petites explications : pour des raisons expérimentales, certains capteurs ont été enlevés/remplacés à partir d'une certaine date. On retire 84 capteurs et on en remet 30 nouveau. Donc les 240-84=156 premières colonnes sont les mêmes capteurs. Les 30 dernières colonnes sont nouvelles. Ces nouveaux capteurs étant mal configurés les colonnes temps sont remplies de zéros. La colonne Minimum ( donc la colonne Moyenne) présente des valeurs incohérentes de l'ordre de -10^41. J'aimerai donc ne pas importer ces 30*4 dernières colonnes.
    Je joint un fichier texte en exemple.

    Je pense que l'importation s'arrête à cause d'une erreur car que je choisisse NbCapteurs=156 ou NbCapteurs=240 il n'importe que les 156 premiers capteurs de la première ligne.


    Voilà ce que j'ai compris de la routine "Charger" :
    On déclare les variables, on ouvre une table tempo.
    On met i dans le champ 1.
    On lit, caractère après caractère le fichier texte en concaténant les caractères jusqu'à la tabulation suivante. On convertis le string en date ou numérique. On le met dans le champs correspondant.

    Mes questions :
    -Une fois la boucle for terminée (i=240), on vient de terminé de lire la première ligne. Comment le programme fait pour passer à la ligne suivante?
    -Pourquoi n'y a-t-il pas de condition d'exécution à la boucle "Do" qui englobe la boucle "for"? A quoi sert-elle?
    -A quoi servent les commandes ".AddNew" et ".Update"?

    C'est un peu le bazarre et je ne vous en voudrai pas d'abandonner mon affaire vu tout ce que vous avez fait pour moi!
    Merci encore
    Fichiers attachés Fichiers attachés

  20. #20
    Membre Expert
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Par défaut
    Hello
    On déclare les variables, on ouvre une table tempo.
    on n'ouvre pas de table temporaire mais:
    - on ouvre le fichier à lire
    - on ouvre la table "Table_Mesures" dans un recordset (un tableau immense facilement manipulable)
    Une fois la boucle for terminée (i=240), on vient de terminé de lire la première ligne. Comment le programme fait pour passer à la ligne suivante?
    en fait, on s'arrête à 1 = nbcapteurs ce qui est censé donner la fin de la ligne et pour passer à la suivante, on teste si on trouve 'fin de ligne' chr(13) alors on sort de la boucle et comme i a atteint nbcapteurs, on boucle sur la grande boucle do par dessus la boucle for (c'est t'y pas clair...)
    -Pourquoi n'y a-t-il pas de condition d'exécution à la boucle "Do" qui englobe la boucle "for"? A quoi sert-elle?
    la condition de sortie est "on error goto sortie" ce qui explique l'arrêt au 156° capteur
    -A quoi servent les commandes ".AddNew" et ".Update"?
    c'est des commandes de recordset qui permettent de passer à un nouvel enregistrement (ici de la table) et de l'enregistrer. Elles vont avec "With Rst" c'est pourquoi elles commencent par un point

    En fait, j'ai pas du tout blindé le programme pour qu'il reste simplissime (on ne peut pas se refaire), on pourrait peut être modifier la gestion d'erreur pour lui permettre de continuer à lire les 240 capteurs en n'écrivant rien si une erreur de conversion intervient dans l'un des champs

    Je cherche un peu plus ce soir et je poste l'amélio
    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Importer des données depuis un fichier texte
    Par Tofalu dans le forum Contribuez
    Réponses: 1
    Dernier message: 28/07/2013, 10h55
  2. importer des données d'un fichier texte à access
    Par soria_t dans le forum VBA Access
    Réponses: 6
    Dernier message: 18/07/2008, 15h02
  3. Réponses: 3
    Dernier message: 24/05/2008, 18h56
  4. Importation des données d'un fichier texte
    Par Koukouknizou dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/11/2007, 22h30
  5. Réponses: 2
    Dernier message: 05/01/2006, 00h29

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