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

VBA Access Discussion :

Importer un fichier txt avec des titres indésirables


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut Importer un fichier txt avec des titres indésirables
    Bonjour,

    Je recoit régulièrement un fichier txt que je dois connecter dans une base Access.

    Le problème est que les premières lignes de ce fichier représentent un titre général et un descriptif, ce qui “ruine” ma spécification d’import car les en-têtes commencent 6 lignes plus loin ( voir image jointe).



    La seule solution est manuelle et consiste à enlever les 6 lignes, ou alors à faire un code qui reproduit cette activité manuelle.

    Je voudrais éviter ces solutions et faire quelques chose de plus stable. Un parametrage peut être?

    Quelqu’un a une idée?

    Merci par avance

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    C'est un cas commun...

    Dans Access, tu n'as pas ce type d'option qui dit commencer à partir de...
    Deux raisons :
    1. Ca n'a été implémenté que pour des fichier standard,
    2. Access se sert des premières ligne de données pour identifier le type d'une colonne.

    Donc tu n'as pas d'autre choix que de passer par une étape nettoyage avec un FSO et et TextStream avec ses méthodes ReadLine.
    Tu renconstruits alors le fichier et tu peux l'importer sans soucis.

    Argy

  3. #3
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Ne pourrait-on pas passer le fichier texte par une moulinette VBA-Word?

    Pierre

  4. #4
    Membre expérimenté Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 116
    Points : 1 618
    Points
    1 618
    Par défaut
    La valeur de 6 lignes est-elle immuable ?
    Dans ce cas, enlever les 6 premières lignes avec une petite boucle sur le fichier plat.

  5. #5
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par pier.antoine Voir le message
    Bonjour

    Ne pourrait-on pas passer le fichier texte par une moulinette VBA-Word?

    Pierre
    OLE OLE !!!
    Non, franchement, ça ne me serait jamais venu à l'esprit de traiter un fichier texte de la sorte...


    Argy

  6. #6
    Membre expérimenté Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 116
    Points : 1 618
    Points
    1 618
    Par défaut
    C'est pourtant la première chose qui m'est venue à l'esprit. De plus il me semble que c'est la plus simple. En 5 lignes c'est fait !

  7. #7
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    tu mets un compteur (appelons le i) dans la boucle qui lit le fichier
    et tant que i<6, on ne fait rien, sinon on traite le fichier.....

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par elnipal Voir le message
    tu mets un compteur (appelons le i) dans la boucle qui lit le fichier
    et tant que i<6, on ne fait rien, sinon on traite le fichier.....
    Non, ce n'est pas une lecture sequentielle dont il s'agit... enfin pas seulement.
    Tu ne sembles pas avoir bien lu la problématique du script d'import d'Access
    Si c'était cela, le processus reviendrait de toute façon au même...
    Il ne s'agit pas d'un traitement à la volée et ligne à ligne, il s'agit d'obtenir un fichier directement importable dans les condtions issues du script d'import qui attend un fichier avec un format identique à chaque fois...

    Citation Envoyé par stigma
    En 5 lignes c'est fait !
    Je demande à voir.
    Rien qu'en déclarant proprement* tes variables, tu les dépasses.

    Argy

    *Sauf si tu adoptes la méthode du : bien entendu

  9. #9
    Membre expérimenté Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 116
    Points : 1 618
    Points
    1 618
    Par défaut
    A mon avis mais je peux me tromper, je lirai le fichier séquentiellement. Je saute les 6 premières lignes indésirables puis je crée un second fichier débarrassé des ces premières lignes.
    Il me reste donc à utiliser ce 2eme fichier épuré pour mon traitement.

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Oui c'est tout à fait ça, Stigma, c'est ce que j'ai suggéré dès le début... avec mon FSO et mon TextStream...

    Mais jamais tu feras tenir ce que tu dis en 5 lignes ou alors tu triches et tu bannis l'Option Explicit et la gestion d'erreur !

    De plus, ce n'est pas à toi qu'était adressée ma remarque mais à pier.antoine qui suggérait de passer par Word !!!

    Moi, en épurant au mieux sans conditions de vérification d'existence d'occurences comparatives, j'arrive à cela :

    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
    Sub TestPourVoir()
    Const F = "C:\Documents and Settings\argyronet\My Documents\TestLine1To64.txt"
    If CleanFileToImport(F, 6, True) = False Then
        MsgBox "Le fichier n'a pas pu être préparé :" & vbCrLf & vbCrLf & Error(m_lngError) & " (" & m_lngError & ")", vbExclamation
    End If
    End Sub
     
    Private Function CleanFileToImport(ByVal ImportFilename As String, ByVal GetLinesAfter As Long, ByVal DeleteTempFileAfter As Boolean) As Boolean
    Const TEMP_FILE_NAME                                   As String = "VoidTmp~"
    Dim oFSO                                               As Scripting.FileSystemObject
    Dim oStreamReader                                      As Scripting.TextStream
    Dim oStreamWriter                                      As Scripting.TextStream
    Dim strGoodLine                                        As String
    Dim strFileName                                        As String
    Dim strPathName                                        As String
    Dim strTempDataFile                                    As String
    Dim L                                                  As Long
     
        On Error GoTo CleanFileToImport_Error
     
        Set oFSO = New Scripting.FileSystemObject
     
        strPathName = Left$(ImportFilename, InStrRev(ImportFilename, "\"))
        strFileName = Mid$(ImportFilename, InStrRev(ImportFilename, "\") + 1)
        strTempDataFile = strPathName & TEMP_FILE_NAME & strFileName
     
        With oFSO
            If .FileExists(strTempDataFile) Then .DeleteFile strTempDataFile, True
            Set oStreamReader = .OpenTextFile(ImportFilename, ForReading, False)
            Set oStreamWriter = .OpenTextFile(strTempDataFile, ForWriting, True)
        End With
     
        With oStreamReader
            Do While .AtEndOfStream <> True
                L = L + 1
                strGoodLine = .ReadLine
                If L > GetLinesAfter Then
                    oStreamWriter.WriteLine strGoodLine
                End If
            Loop
            .Close
            oStreamWriter.Close
        End With
     
        With oFSO
            .CopyFile strTempDataFile, ImportFilename, True
            If DeleteTempFileAfter Then
                .DeleteFile strTempDataFile, True
            End If
        End With
        CleanFileToImport = True
     
        On Error GoTo 0
    CleanFileToImport_Exit:
        Set oStreamWriter = Nothing
        Set oStreamReader = Nothing
        Set oFSO = Nothing
        Exit Function
    CleanFileToImport_Error:
        m_lngError = Err
        CleanFileToImport = False
        Resume CleanFileToImport_Exit
    End Function

  11. #11
    Membre expérimenté Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 116
    Points : 1 618
    Points
    1 618
    Par défaut
    Quand je disais 5 lignes, c'était une façon de parler, un peu comme on dit "En 2 coup de cuiller à pot" ou "En 2 temps 3 mouvements"

  12. #12
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Je me doute...
    Tu es déjà un ancien ici...

    Je suis pas d'humeur, on m'a piqué ma voiture hier et du coup, j'ai écrasé mon grain de sagesse pour quelques jours...

    Pour tout dire, j'ai maintes fois traité ce genre de cas ;

    En fait, de par une perspicacité dégoulinante, j'ai pris la liberté de considérer que piflechien73 ne maîtrise pas forcément la manupulation des fichiers en VBA... Il est évident dans ses propos qu'il sait parfaitement ce qu'il faut faire mais ne sait pas forcément comment et c'est la raison de sa présence.

    De ce fait, suggérer des tu fais ci et tu fais ça sans préciser quoi, dans ses coutures, ne mène à rien et encombre le dialogue.

    Argy

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci mille fois pour vos explications initiales et pour le code.

    Le principe correspond en effet à ce que je souhaiterais : quelque chose qui évite la manipulation intermédiaire d'un autre fichier du genre Word.

    Par contre cela ne marche pas car mon VBA sous ACCESS 2003/VISTA ne comprend pas Scripting.FileSystemObject. Sur Internet j'ai lu qu'il faut récupérer la dll Scrrun mais je ne la trouve pas. J'ai dû rater un truc

  14. #14
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bien en fait, scrrun.dll fait partie intégrante de windows.
    Depuis VBE, tu vas dans outils/références et du cliques sur Parcourir si toutefois das la liste, la mention Microsoft Scripting Runtime n'y figure pas.
    Tu vas alors dans %WIN%\%SYS32% et tu localises la DLL scrrun.dll.

    Tiens nous au courant.

    Argy

  15. #15
    jojo5650
    Invité(e)
    Par défaut Prenons le problème à l'envers.
    La structure que tu veux injecter est standardisée!
    Alors on lit le fichier ligne par ligne, par un object FSO.
    Je le lit tant qu'il n'est pas eof().
    Je gère l'erreur en manuel instruction on error resume next .
    Je lit une ligne, pour l'injecter dans la db.
    si erreur alors pas d'injection dans la DB, lire la ligne d'après et ainsi de suite.
    Chaque fois qu'il a eu d'erreur ne pas oublier err.clear
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if err.number <>0 then
       pas d'importaion
        err.clear 'important pour enlever l'erreur
    else
       importation des données
    end if
    A un moment donné eof devient true et tu ecrit juste après on error goto 0pour revenir à la gestion des erreurs automatique
    les données exploitables sont transférées
    Si cela n'est pas clair pose un fichier texte et ta db pour résoudre ton problème

    Citation Envoyé par stigma Voir le message
    C'est pourtant la première chose qui m'est venue à l'esprit. De plus il me semble que c'est la plus simple. En 5 lignes c'est fait !

  16. #16
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Je ne voulais surtout pas créer de polémique.

    Ne maîtrisant pas (loin de là) la gestion des fichiers avec Access, mon premier reflexe était d'utiliser Word.

    Mais si cela peut se faire directement dans VBA Access, c'est sans aucun doute la piste à suivre.

    JE vous remercie de vos indications, je vais creuser cela (car cela devrait me servir pour traiter un fichier texte brut que je récupérais d'abord dans excel).

    Bonne journée.

    Pierre

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    argyronet:

    J'ai fait les modifs et cela fonctionne bien! Merci mille fois!

    Petit bémol : Même si j'ai toute la base de données, je perds la ligne des entêtes. Il y a t'il un moyen de la garder? Si ce n'est pas possible, ce n'est pas grave, je peux recréer les titres dans les spécifications. Ci joint un extrait ( titres initiaux + entête+2 enregistrements, tout transformé car données confidentielles ).

    jojo5650: Merci pour l'explication générale, du coup j'ai compris un peu le principe aussi de ce que argyronet a envoyé. Par contre c'est vrai que dans le développement, c'est au delà de mes connaissances, j'aurai du mal à développer ce que vous écrivez.

  18. #18
    jojo5650
    Invité(e)
    Par défaut
    merci du compliment

    Citation Envoyé par piflechien73 Voir le message
    argyronet:

    J'ai fait les modifs et cela fonctionne bien! Merci mille fois!

    Petit bémol : Même si j'ai toute la base de données, je perds la ligne des entêtes. Il y a t'il un moyen de la garder? Si ce n'est pas possible, ce n'est pas grave, je peux recréer les titres dans les spécifications. Ci joint un extrait ( titres initiaux + entête+2 enregistrements, tout transformé car données confidentielles ).

    jojo5650: Merci pour l'explication générale, du coup j'ai compris un peu le principe aussi de ce que argyronet a envoyé. Par contre c'est vrai que dans le développement, c'est au delà de mes connaissances, j'aurai du mal à développer ce que vous écrivez.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/10/2012, 10h28
  2. Réponses: 1
    Dernier message: 20/11/2007, 15h12
  3. Importation de fichiers TXT avec chemin variable
    Par moulayoubi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/04/2007, 14h29
  4. Ecrire un fichier .txt avec des retours chariot
    Par french-petzouille dans le forum Langage
    Réponses: 9
    Dernier message: 30/03/2007, 20h01
  5. probleme d'import de fichier txt avec des tab
    Par lecureuil dans le forum Access
    Réponses: 4
    Dernier message: 23/08/2005, 19h22

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