2009-02-24 13 views
1

J'ai une base de données Access que je voudrais exporter dans un fichier texte. J'ai un schéma défini dans Access, et utilise actuellement une macro pour l'exporter. Je voudrais utiliser VBScript pour toujours ajouter le résultat d'une requête au même fichier. S'il n'est pas possible d'utiliser mon schéma défini, j'ai seulement besoin que les champs soient séparés par des virgules et entourés par le ", et le fichier texte doit être au format UTF-8.Comment exporter une base de données Access au format CSV?

J'ai trouvé l'extrait de code suivant, mais je ne suis pas sûr de savoir comment l'adopter pour mes besoins.

db = "C:\Docs\LTD.mdb" 
TextExportFile = "C:\Docs\Exp.txt" 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

cn.Open _ 
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _ 
    "Data Source =" & db 

strSQL = "SELECT * FROM tblMembers" 

rs.Open strSQL, cn, 3, 3 

Set fs = CreateObject("Scripting.FileSystemObject") 

Set f = fs.CreateTextFile(TextExportFile, True) 

a = rs.GetString 

f.WriteLine a 

f.Close 
+0

Souhaitez-vous exporter toutes les tables utilisateur de la base de données ou uniquement des tables spécifiques? Cela pourrait aider si l'objectif de la tâche était connu. – AnthonyWJones

+0

Une table entière, sélectionnez simplement * dans le tableau. –

+0

J'ai lu quelque chose comme ça et je me suis immédiatement demandé * pourquoi * vous en avez besoin. Ma conjecture est que votre destination pour le fichier texte pourrait avoir de meilleures solutions à ce problème. –

Répondre

1

DIRECTION (2) Ceci est une VBA, exécutez à partir de la base de données Access:

Sub InsertRecs() 
Set db = CurrentDb 

'DSN=Suitable system DSN for MySQL 
'Then, depending on your set up, you can incude: 
'Database=DBName; 
'Trusted_Connection=Yes; 

'NameOfMySQLTable 
strSQL = "INSERT INTO [ODBC;DSN=baywotch;].tblAuction Select * FROM tblAuction;" 

db.Execute strSQL, dbFailOnError 
End Sub 

C'est la même chose, mais dans VBScript, en utilisant DAO:

Dim objEngine 
Dim objWS 
Dim objDB 
Dim db: db = "C:\Docs\baywotch.db5" 

Set objEngine = wscript.CreateObject("DAO.DBEngine.36") 

Set objDB = objEngine.OpenDatabase(db) 

objDB.Execute "INSERT INTO [ODBC;DSN=baywotch].[tblAuction] SELECT * FROM tblAuction;" 

DIRECTION (1)

Je suggère une direction complètement différente, et est de laisser MySQL faire le travail:

MySQL Migration Toolkit

Je l'ai testé ce contre votre base de données, et il semble importer correctement, ne prend que quelques minutes, et va générer toutes sortes de scripts réutilisables et ainsi de suite.

Si vous rencontrez des problèmes avec l'installation de MySQL, vous pouvez lire: 9.1.4. Connection Character Sets and Collations

DIRection (0)

REWRITE (2)

'========================================================================' 
' 
'     FROM: AnthonyWJones, see post ' 
' 
'========================================================================' 
Dim db: db = "C:\Docs\baywotch.db5" 
Dim exportDir: exportDir = "C:\Docs\" '" SO prettify does not do VB well 
Dim exportFile: exportFile=NewFileName(exportDir) 


Dim cn: Set cn = CreateObject("ADODB.Connection") 

cn.Open _ 
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _ 
    "Data Source =" & db 

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
    ";CharacterSet=65001]." & exportFile & " FROM tblAuction" 

'Export file 

'========================================================================' 

'Support functions 

Function NewFileName(ExportPath) 
Dim fs 
Dim NewFileTemp 

Set fs = CreateObject("Scripting.FileSystemObject") 

NewFileTemp = "CSV" & Year(Date) _ 
    & Right("00" & Month(Date),2) & Right("00" & Day(Date) ,2) & ".csv" 

a = fs.FileExists(ExportPath & NewFileTemp) 

i = 1 
Do While a 
    NewFileTemp = "CSV" & Year(Date) _ 
     & Right("00" & Month(Date),2) & Right("00" & Day(Date) ,2) & "_" & i & ".csv" 

    a = fs.FileExists(ExportPath & NewFileTemp) 
    i = i + 1 
    If i > 9 Then 
     'Nine seems enough times per day to be 
     'exporting a table 
     a = True 
     MsgBox "Too many attempts" 
     WScript.Quit 
    End If 
Loop 

NewFileName = NewFileTemp 
End Function 
+0

Je l'ai trouvé sur ce site :) ahh, oubliez le schéma, je voulais dire la spécification, je suis désolé pour la confusion. Je voulais seulement dire que je voulais que le texte soit transféré selon ma spécificité. Existe-t-il un moyen de générer le nom de fichier à partir de la date? –

+0

Oui, voir mon édition. – Fionnuala

+0

Je ne sais pas comment ty les deux exemples ensemble .., comment spécifiez-vous la requête et où il devrait être écrit? –

1

Peut-être la façon la plus simple est d'utiliser [texte ...] approche de nom de fichier: -.

Dim db: db = "C:\Docs\LTD.mdb" 
Dim exportDir: exportDir = "C:\Docs\" '" SO prettify does not do VB well 
Dim exportFile: exportFile = "Exp.txt" 

Dim cn: Set cn = CreateObject("ADODB.Connection") 

cn.Open _ 
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _ 
    "Data Source =" & db 

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
    ";CharacterSet=65001]." & exportFile & " FROM tblMembers" 

FileSystemObject ne vous aidera pas car il ne fait pas UTF-8. UTF-8 est obtenu en spécifiant CharacterSet = 65001 (65001 est la page de code UTF-8). Notez que le fichier généré ne contient pas de nomenclature UTF-8 mais le fichier schema.ini créé notera que le CharacterSet est UTF-8.

Notez que cela n'atteint pas vos conditions d'ajout, êtes-vous sûr que cela a du sens de toute façon, ne vous retrouverez-vous pas avec beaucoup de doublons?

Modifier:

ci-dessus est ajustée pour inclure l'exigence UTF-8. Vous pouvez simplement ajouter quelque chose comme la date pour créer plusieurs fichiers instantanés pour la table.

+0

Je vais couper les données ajoutées dans un nouveau fichier, sauf si je peux écrire un nom de fichier unique (date?) À chaque fois? Pouvez-vous expliquer la dernière ligne un peu plus loin? N'y a-t-il aucun moyen de forcer utf-8 avec vbs? Merci pour votre aide jusqu'à présent :) –

+0

J'ai modifié la réponse à la question de l'exigence UTF-8. Vous pouvez simplement écrire à un nom de fichier unique à chaque fois. Notez que si vous supprimez par la suite un fichier, vous devez mettre à jour shema.ini. Alternativement, vous pourriez être en mesure d'utiliser un fournisseur de texte pour déposer le fichier, ce qui mettra à jour le schéma pour vous. – AnthonyWJones

+0

Veuillez m'excuser en ajoutant votre code à mon message, c'est d'illustrer le nouveau nom de fichier à l'OP. J'ai reconnu la source. – Fionnuala

0

J'ai numéroté les lignes pour référence.

1. db = "C:\Docs\LTD.mdb" 
2. TextExportFile = "C:\Docs\Exp.txt" 
3. strSQL = "SELECT * FROM tblMembers" 
4. Set f = fs.CreateTextFile(TextExportFile, True) 

Ligne 1 - est le fichier de base de données d'accès en cours avec lequel vous travaillez. ce cas c'est LTD.mdb
Ligne 2 - est le nom du fichier que vous allez écrire/ajouter. C'est Exp.txt
Ligne 3 - est l'instruction sql qui sera utilisée pour collecter les données.
Ligne 4 - est la commande pour ouvrir le fichier à écrire.

Remplacez la ligne 2 par le nom du fichier que vous voulez.
Remplacez la ligne 3 par la table que vous voulez utiliser. Select * utilisera toutes les colonnes si vous voulez que seulement un couple les identifie par leur nom. sélectionnez col1, col2 ... depuis mytable. Vous voudrez regarder dans l'utilisation des clauses where.

Modifiez la ligne 4 de CreateTextFile à OpenTextFile et utilisez ForAppending pour ajouter. MSDN VBA

Je dessine un blanc sur le formatage de la ligne. L'un des moyens que j'utilise est de modifier l'instruction select pour inclure des virgules. exemple, sélectionnez col1 & "," & col2 à partir de mytable.

Pour UTF-8 (je n'ai pas un exemple de travail) Essayez:

utf = new String(a, 0, a.length, UTF-8); 
f.WriteLine utf; 

UTF-8 VBA

0

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adClipString = 2 
Const ForWriting = 2 
Const ForAppending = 8 
Const strDB = "C:\Docs\LTD.mdb" 
Const strCSV = "C:\Docs\Exp.csv" 

Set objAccessConnection = CreateObject("ADODB.Connection") 
objAccessConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & strDB 

Set objAccessRecordset = CreateObject("ADODB.Recordset") 

strAccessQuery = "SELECT * FROM tblMembers" 
objAccessRecordset.Open strAccessQuery, objAccessConnection, adOpenStatic, adLockOptimistic 

Set objCSV = CreateObject("Scripting.FileSystemObject").OpenTextFile(strCSV, ForAppending, True) 
objCSV.Write objAccessRecordset.GetString(adClipString,,",",CRLF) 

objCSV.Close 
Set objCSV = Nothing 
objAccessRecordset.Close 
Set objAccessRecordset = Nothing 
objAccessConnection.Close 
Set objAccessConnection = Nothing 
+0

Qu'en est-il des lignes de texte avec des virgules? CSV cite normalement du texte. – Fionnuala

+0

Dans ce cas, il devrait parcourir chaque champ de chaque enregistrement et créer le fichier csv le long chemin. Ou ne mettez pas de virgules dans la base de données. – Tester101

Questions connexes