Importer CSV dans une table Access [Résolu]

pokeswell 5 Messages postés mercredi 29 mars 2006Date d'inscription 11 janvier 2008 Dernière intervention - 29 mars 2006 à 04:57 - Dernière réponse : pokeswell 5 Messages postés mercredi 29 mars 2006Date d'inscription 11 janvier 2008 Dernière intervention
- 2 avril 2006 à 00:07
Bonjour à tous. J'ai une base de donnée Access dans laquelle j'ai une table avec des clients et les transactions qui leurs sont associées selon une date de l'année.

Par exemple

NoClient
Transactions
Date

J'aimerais construire un programme en VB6 de maniere à pouvoir importer les nouvelles transactions dans la table à mesure que je les recois...

Voici un exemple du fichier source de donnée:

numéro du client|Transaction|Date­
3031123365|44|2/1/2006 12:00:00 AM

puisque mon fichier m'arrive quotidiennement et qu'il contient environ 2000 lignes j'aimerais pouvoir ajouter les lignes du fichier CSV à ma base de données.

La question est donc: Comment faire pour "Appender" à la table Access les lignes provenant du fichier CSV directement sans passer par Excel...(de maniere à pouvoir automatiser totalement le processus)? AIDEZ MOI SVP!!!
Afficher la suite 

5 réponses

cs_jperre 268 Messages postés lundi 9 janvier 2006Date d'inscription 19 janvier 2017 Dernière intervention - 29 mars 2006 à 09:32
+3
Utile
Pour importer un fichier csv (ou un autre type de fichier texte), on dispose des fonctions de lecture et écriture de fichier dans VB et VBA (ce sont les mêmes). Pour le cas présent, je suppose que le trait vertical est le séparateur de champs et que les données ne sont pas entourées de doubles cotes.

Sub ImportCSV(sFileCSV As String, sTable As String)
Dim lFileCSV As Long, sLine As String, rsTable As Recordset
Dim sField As String, n As Integer, m As Long
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Set rsTable=CurrenDB.OpenRecordset(sTable, dbOpenTable)
Do
Line Input #lFileCSV, sLine
rsTable.AddNew
For n=1 To Len(sLine)
If Mid(sLine, n, 1)<>"|" Then
sField=sField & Mid(sLine, n, 1)
Else
rsTable(m)=sField
sField=""
m=m+1
End If
If n=Len(sLine) Then
rsTable(m)=sField
sField=""
m=0
End If
Next n
rsTable.Update
Loop Until EOF(lFileCSV)
Close #lFileCSV
rsTable.Close
End Sub
Cette réponse vous a-t-elle aidé ?  
cs_jperre 268 Messages postés lundi 9 janvier 2006Date d'inscription 19 janvier 2017 Dernière intervention - 30 mars 2006 à 08:53
+3
Utile
Dans VB6, il faut venir dans le menu Projet, puis References et ajouter la référence à Microsoft DAO 3.51 (Access 97) ou DA0 3.6(Access 2000) qui fait partie de VB6 (DAO 3.6 est dans le service Pack 6 de VB6). Ensuite, les objets de DAO sont accessibles. Il s'agit des Objets :
- Microsoft Jet = DBEngine
- Espace de travail = WorkSpace
- Base de données = Database
- Connexion = Connection
- Structure de table = TableDef
- Requête = QueryDef
- Relation entre tables = Relation
- Champ = Field
- Index = Index
- Feuille de reponse = Recordset
A l'exception de DBEngine, tous ces objets peuvent être utilisés dans des collections d'objets.

Dans ce cas précis, il faudrait :

Sub ImportCSV(sFileCSV As String, sTable As String)
Dim dbTrait As DAO.Database, rsTable As DAO.Recordset
Dim lFileCSV As Long, sLine As String
Dim sField As String, n As Integer, m As Long
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Set dbTrait=DBEngine(0).OpenDatabase("c:\baseDtest.mdb")
Set rsTable=dbTrait.OpenRecordset(sTable,dbOpenTable)
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Do
Line Input #lFileCSV, sLine
rsTable.AddNew
For n=1 To Len(sLine)
If Mid(sLine, n, 1)<>"|" Then
sField=sField & Mid(sLine, n, 1)
Else
If m=1 Then
rsTable(m)=Val(sField)
Else
rsTable(m)=sField
End If
sField=""
m=m+1
End If
If n=Len(sLine) Then
rsTable(m)=CDate(sField)
sField=""
m=0
End If
Next n
rsTable.Update
Loop Until EOF(lFileCSV)
Close #lFileCSV
rsTable.Close
dbTrait.Close
End Sub
Voilà, tout est détaillé, j'ai même ajouté une mise en forme des données pour alimenter le deuxième champ au format numérique et le troisième au format date.
Cette réponse vous a-t-elle aidé ?  
pokeswell 5 Messages postés mercredi 29 mars 2006Date d'inscription 11 janvier 2008 Dernière intervention - 30 mars 2006 à 08:27
0
Utile
Merci beaucoup pour ce code!
Dans mon cas, ce code se retrouve à l'intérieur d'une très simple application VB6 et non directement dans ACCESS 2003....

Donc, comment dois-je faire pour spécifier les paramètres de la fonction suivante:
Sub ImportCSV(sFileCSV As String, sTable As String)

d'ouvrir la table "tblTransactions" de la base de données "c:\baseDtest.mdb" pour y ajouter les entrées? C'est-à-dire que je ne pige pas comment spécifier dans le code, comment spécifier la table exacte qui doit être ouverte dans une base de donnée particulière?

Merci encore!
Pokeswell
pokeswell 5 Messages postés mercredi 29 mars 2006Date d'inscription 11 janvier 2008 Dernière intervention - 1 avril 2006 à 19:51
0
Utile
Merci jperre! Ca fonctionne bien maintenant.

Par contre j'ai du adapter cette ligne la:
Set dbTrait=DBEngine(0).OpenDatabase("c:\baseDtest.mdb")

Par celle la:
Set dbTrait = dao.OpenDatabase("c:\baseDtest.mdb")
pokeswell 5 Messages postés mercredi 29 mars 2006Date d'inscription 11 janvier 2008 Dernière intervention - 2 avril 2006 à 00:07
0
Utile
Puisque dans ma base de données, la table en question ne comprend pas de clé unique, comme un numéro unique... comment puis-je faire pour savoir si une ligne de mon fichier csv a déja été ajouté à la table?

Merci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.