Как экспортировать базу данных Access в формат CSV?

У меня есть база данных Access, которую я хотел бы экспортировать в текстовый файл. У меня есть схема, определенная в Access, и в настоящее время я использую макрос для ее экспорта. Я хотел бы использовать VBScript, чтобы всегда добавлять результат запроса в один и тот же файл. Если невозможно использовать мою определенную схему, мне нужно только поля, разделенные запятыми и заключенные в ", и текстовый файл должен быть в UTF-8 формате.

Я нашел следующий фрагмент кода, но не знаю, как адаптировать его для своих нужд.

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

Ответов (4)

Решение

НАПРАВЛЕНИЕ (2) Это некий VBA, запускаемый из базы данных 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

Это то же самое, но в VBScript с использованием 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;"

НАПРАВЛЕНИЕ (1)

Я предлагаю совершенно другое направление - позволить MySQL выполнять работу:

Набор средств миграции MySQL

Я протестировал это на вашей базе данных, и, похоже, он импортируется правильно, занимает всего несколько минут и генерирует всевозможные сценарии многократного использования и так далее.

Если у вас возникли проблемы с установкой MySQL, вы можете прочитать: 9.1.4. Наборы символов подключения и сопоставления

НАПРАВЛЕНИЕ (0)

ПЕРЕПИСАТЬ (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 

Возможно, самый простой способ - использовать подход [text ...]. Filename: -

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 вам не поможет, поскольку он не поддерживает UTF-8. UTF-8 достигается путем указания CharacterSet = 65001 (65001 - это кодовая страница UTF-8). Обратите внимание, что созданный файл не содержит спецификации UTF-8, но в созданном файле schema.ini будет указано, что CharacterSet - это UTF-8.

Обратите внимание, что это не соответствует вашим требованиям к добавлению, вы уверены, что это все равно имеет смысл, не будет ли у вас много дубликатов?

Редактировать :

Вышеупомянутое изменено с учетом требования UTF-8. Вы можете просто добавить что-то вроде даты, чтобы создать несколько файлов моментальных снимков для таблицы.

Я пронумеровал строки для справки.

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

Строка 1 - это текущий файл базы данных доступа, с которым вы работаете. В данном случае это LTD.mdb.
Строка 2 - это имя файла, который вы собираетесь записать / добавить. Это Exp.txt
Line 3 - это оператор sql, который будет использоваться для сбора данных.
Строка 4 - это команда открытия файла для записи.

Измените строку 2 на имя нужного файла.
Измените строку 3 на таблицу, которую вы хотите использовать. Выберите * будет использовать все столбцы, если вы хотите, чтобы только пара определяла их по имени. выберите col1, col2 ... из mytable. Вы также захотите изучить использование предложений where.

Измените строку 4 с CreateTextFile на OpenTextFile и используйте ForAppending для добавления. MSDN VBA

Рисую пробел по форматированию линии. Один из способов, который я использую, - это изменить оператор выбора, добавив запятые. пример выберите col1 & "," & col2 из mytable.

Для UTF-8 (у меня нет рабочего примера) Попробуйте:

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

UTF-8 VBA


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