Mise à jour d’une base Access par fichier CSV ou Excel – Episode 5

Passerelles Access CSV

Je continue la série d’articles sur l’importation de données CSV ou Excel dans Access.

Dans cet article : comment traiter le cas d’un fichier CSV dont le délimiteur est particulier ? Par exemple un point-virgule au lieu d’une virgule.

Si vous avez manqué le début

Relisez les articles précédents, si vous ne l’avez pas déjà fait. Sinon, rien ne marchera… 😉

Le fichier source

Cette fois, j’utilise une autre table (tbl Clients) et le fichier CSV correspondant (clients.csv). Mon souci principal est que le séparateur de champs, dans ce fichier, est le point-virgule… et je n’ai bien sûr par l’intention de modifier le fichier manuellement. 😉

"Numéro Client";"Titre";"Nom Client";"Prénom Client";"Adresse 1";"Adresse 2";"Code Ville";"Téléphone personnel";"Téléphone mobile";"Téléphone bureau";"Email";"Site web";"Remarques";"Date de création";"Date de modification";"Archiver"
1;"Madame";"KUNTZ";"Anne";"Impasse des Jambettes";;13;"03 11 12 13 14";;"03 12 13 14 15";"anne.kuntz@orange.fr#mailto:anne.kuntz@orange.fr#";;"";14/5/2007 12:25:40;14/5/2007 12:29:57;1
2;"Mademoiselle";"DELISLE";"Marie";"Résidence les Goélettes";;12;"01 07 08 09 10";;;"marie.delisle@sfr.fr#mailto:marie.delisle@sfr.fr#";;"";14/5/2007 12:30:34;13/7/2007 19:29:40;0
3;"Monsieur";"LAMARK";"Paul";"4, rue Bouchain";;1;"02 10 11 12 13";"06 70 71 72 73";;"paul.lamark@free.fr#mailto:paul.lamark@free.fr#";;"";14/5/2007 13:01:19;14/5/2007 13:04:10;0
4;"Monsieur et Madame";"MARTIN";"Yves";"109, avenue de Galbord";;2;"05 11 12 13 14";;;"yves.martin@free.fr#mailto:yves.martin@free.fr#";;"";14/5/2007 13:04:13;14/5/2007 13:05:59;0
5;"Monsieur et Madame";"KELLER";"Maxime";"8, boulevard Virures";;3;;"06 80 81 82 83";;"maxime.keller@free.fr#mailto:maxime.keller@free.fr#";;"";14/5/2007 13:06:02;14/5/2007 13:08:20;0
6;"Monsieur et Madame";"HERMAND";"Marc";"Traverse Les Barrots";;4;"04 08 09 10 11";;"04 09 10 11 12";"marc.hermand@sfr.fr#mailto:marc.hermand@sfr.fr#";;"";14/5/2007 13:08:23;14/5/2007 14:29:09;0

Le principe

D’une manière générale, si le fichier CSV n’est pas complètement standard (séparateur, colonnes à importer, format des dates…), l’idée est de créer une spécification d’importation, et de l’utiliser au moment de l’importation.

Cet article ne détaille pas le principe des spécifications d’importation, mais elles sont traitées sur cet autre article du blog. Dans ce qui suit, je dispose d’une spécification appelée « Import Clients« , dont la forme est :

Spécifications d'importation Clients

Le code de test

Pour tester tout ça (à supposer que vous ayez le fichier Clients.csv de départ), ajoutez cette procédure dans le module mod Tests TableUpdater (que vous avez créé dans les articles précédents) :

La nouveauté est la ligne qui précise d’utiliser nos spécifications d’importation :

Sans les spécifications d’importation, le séparateur de champs ne serait pas reconnu, et l’importation échouerait :

Echec de l'importation CSV

Et comme l’importation échoue, Access crée une table d’erreurs appelée ici Clients_ImportErrors qui liste les enregistrements fautifs (tous !).

Info
Je rappelle que, lorsque la série d’articles sera terminée, je posterai dans la section Téléchargements du blog une base de données complète reprenant tous les exemples. Vous pourrez donc tester ce bout de code, avec le fichier Clients.csv.

Vous aimerez aussi...

16 réponses

  1. seb dit :

    Bonjour, je voulais télécharger le fichier test de cet article mais dans la section téléchargement il n’y apparait pas.
    J’ai toujours une erreur 3 clé primaire, et j’ai beau tout essayer ça ne fonctionne pas alors je voulais comparer avec votre fichier pour trouver l’erreur.

    • Hervé Inisan dit :

      Le fichier test n’est effectivement pas dans la section Téléchargements. Pour le récupérer, il suffit :
      1. De sélectionner directement le code dans cet article (paragraphe « Le fichier source »).
      2. De le copier.
      3. De le coller dans un éditeur de texte (du type PSPad ou Notepad++).
      4. D’enregistrer avec une extension .csv ou .txt.

  2. milie dit :

    bonjour
    comment je peux faire ma mise a jour dans ma table en gardant toujours l’anciennes mise a jour sachant que mon fichier CSV il a une clé primaire pour chaque employee
    j’ai fais tous ces épisodes mais j’ai trouver que la mise a jour ecrase toujours les données qui existe déjà
    merci d’avance !
    merci d’avance

    • Hervé Inisan dit :

      Ce qui doit se passer, en principe :
      – Les employés avec une clef existante dans la table vont être mis à jour.
      – Les employés dont la clef n’existe pas vont être ajoutés à la table.
      Si j’ai suivi ta question : il est normal qu’une mise à jour remplace les données déjà existantes dans la table.
      Qu’est-ce que tu appelles « garder l’ancienne mise à jour » ?

      • milie dit :

        Merci de votre répense
        garder les anciennes mise a jour ça veut dire garder les données qui existe déjà dans la table
        par exemple si je fais une mise a jour des employees avec leurs données de mois Juillet, la prochaine mise a jour du mois Aout elle doit ajouter a nouveau les même employees avec leur données mais de garder aussi les données du mois Juillet et ainsi de suite 🙂
        ( pour moi la mise a jour doit ajouter des lignes et non pas ecrasser les lignes qui existes dejà par ce que meme si j’ai mis la ligne CurrentDb.Execute « DELETE * FROM [Table1] » ) en commentaire la mise a jour exrasse toujours les données qui existe déjà par ce qu’elle trouver que la clé primaire existe déjà !!
        je doit obtenir au final par exemple
        ID,Nom,Prenom,heure_de_travail,période
        Id1,nom1,prenom1,45,juillet
        Id2,nom2,prenom2,43,juillet
        id1,nom1,prenom1,40,Aout
        id2,nom2,prenom2,42,Aout

        j’éspère que j’ai détaillé le mieu possible mon problème 😀

        • Hervé Inisan dit :

          En fait, le problème ne vient pas de l’importation CSV. Il s’agit plutôt d’un problème de conception de la base : avec ta structure, il est impossible de créer plusieurs lignes par employé (puisque la clef primaire doit être unique dans la table).
          Il faut revoir ton schéma de relations : 1 employé peut être lié à plusieurs périodes de travail, et 1 période de travail précise n’est liée qu’à un seul employé. Tu as donc besoin de 2 tables :
          – Les employés
          – Les périodes de travail
          Avec une relation « 1 à plusieurs » entre les deux. A partir de là, on peut gérer autant de périodes de travail qu’on le souhaite, pour chaque employé.

  3. nioko dit :

    Bonjour Hervé Inisan
    un problème au niveau de la spécification d’importation
    quand j’exécute le code il me donne l’erreur #5 : erreur d’imporation
    et quand je met la ligne « 20 » en commentaire il me donne l’erreur numero #6
    j’ai esseayé aussi avec la table « tbl Destinataires Newsletter » et le meme problème existe toujours

    • Hervé Inisan dit :

      Est-ce qu’il peut y avoir une erreur sur le nom de la spécification ? Sur un réglage de la spécification ?

      • nioko dit :

        J’ai enregister les spécifications et j’ai pu éviter les erreur #5 et #6
        mais là ! je rencontre une autre erreur situer dans le module tableupdater
        dans le bloc de « suppression des objets temporaires »
        voilà la ligne mentionnée en jaune : CurrentDb.QueryDefs.Delete UPDATE_QUERY

      • nioko dit :

        merci infiniment pour votre aide
        la méthode fonctionne correctement mais comment je peux l’appliquer a une table qui contient 2 colonnes qui ont le meme Nom
        j’ai essayé mais il m’a afficher l’erreur  » #6 : erreur d’insertion des lignes »
        et quand j’ai vérifié la table temporaire j’ai trouvé que le nom de la 2eme colonne s’appel ( Champ ) et non pas son vrai nom

        • Hervé Inisan dit :

          Une table ne peut pas avoir 2 colonnes de même nom. Le fichier CSV de départ a 2 en-têtes identiques ?
          (si oui, il faut le modifier avant l’importation)

          • nioko dit :

            oui le fichier CSV de départ a 2 en-têtes identiques
            -je fais l’exportation de fichier CSV depuis un autre système chaque mois et le ce fichier contient plus de 50 colonnes
            -je ne peux pas accéder au système pour modifer ses colonnes
            est ce qu’il ya une solution a part la modification des en-têtes identiques chaque mois ?

          • Hervé Inisan dit :

            Il faut effectivement modifier les titres de colonnes du CSV à chaque fois, avant intégration dans Access. Soit manuellement, soit par code (avec les fonctions de fichier VBA).

  4. Hervé Inisan dit :

    ratapoilu > Est-ce qu’il peut s’agir d’un autre problème ? Par exemple, est-ce que la date cible a une clef primaire de type NuméroAuto ?

  5. ratapoilu dit :

    Bonjour,

    J’ai suivi tout ce qui est notifié, j’ai créé mon propre fichier csv (qui s’appelle affaire.csv avec des points virgule), j’ai enregistré une importation (Import Affaire), je l’appel bien dans la nouvelle procédure TestTableUpdaterClients, j’ai créé une table correspondante, et quand je lance la procédure de test le message erreur 6 apparait tout de meme.
    J’ai essayé d’executer l’importation que j’ai créé et cela fonctionne très bien. Je ne vois pas ou il peux y avoir une erreur. Pour info, je suis sous access 2013, avec Win 7 64 bits

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *