Exportieren von MS Access-Tabellen als Unicode mit Tilde Begrenzer
Frage
Ich möchte den Inhalt von mehreren Tabellen von MSAccess2003 exportieren. Die Tabellen enthalten Unicode japanische Schriftzeichen. Ich möchte, dass sie als Tilde getrennte Dateien Text speichern.
Ich kann diese manuell mit Datei / Export und in Dialogauswahl Tilde als Feldtrennzeichen ‚Erweitert‘ und der Unicode als Codepage aus.
Ich kann speichern dies als Export-Spezifikation, aber dies scheint Tabelle spezifisch zu sein.
Ich mag viele Tabellen mit VBA-Code.
ExportBisher habe ich versucht:
Unter ExportTables ()
Dim lTbl As Long
Dim dBase As Database
Dim TableName As String
Set dBase = CurrentDb
For lTbl = 0 To dBase.TableDefs.Count
'If the table name is a temporary or system table then ignore it
If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
'~ indicates a temporary table
'MSYS indicates a system level table
Else
TableName = dBase.TableDefs(lTbl).Name
DoCmd.TransferText acExportDelim, "UnicodeTilde", TableName, "c:\" + TableName + ".txt", True
End If
Next lTbl
Set dBase = Nothing
End Sub
Als ich das laufen erhalte ich eine Ausnahme:
Laufzeitfehler '3011': Das Microsoft Jet-Datenbank-Engine das Objekt nicht finden konnte „Allowance1 # txt‘. Stellen Sie sicher, dass das Objekt vorhanden ist, und dass Sie buchstabieren seinen Namen und den Pfadnamen richtig.
Wenn ich an dieser Stelle debuggen, Tablename ist 'Allowance1', wie erwartet.
Ich denke, meine UnicodeTilde Exportspezifikationstabelle spezifisch ist, so kann ich es nicht für mehrere Tabellen verwenden.
Was ist die Lösung? Soll ich etwas anderes verwenden, andere als Transfer, oder vielleicht die Exportspezifikation programmatisch erstellen?
Jede Hilfe sehr geschätzt.
Lösung
Ich habe schließlich löste dies. (Ich bin jetzt mit Access 2007 hatte aber die gleichen Probleme wie mit Access 2003).
Erstens, was nicht funktioniert hat:
Transfer würde nur die Kopfzeile Unicode machen und Tilde begrenzt, auch mit einem korrekt formatiert schema.ini. (Nein, ich habe es nicht setze alle auf einer Linie, das war nur ein Formatierungs Problem mit der HTML-Datei auf Stackoverflow.)
[MyTable.txt]
CharacterSet = Unicode
Format = Delimited(~)
ColNameHeader = True
NumberDigits = 10
Col1= "Col1" Char Width 10
Col2= "Col2" Integer
Col3= "Col3" Char Width 2
Mit nur eine select-Anweisung:
SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable]
Total die FMT ignoriert. Ich fand es sehr schwer, Dokumentation über das Format der Parameter zu finden. Was immer ich in der FMT-Parameter eingegeben haben, die einzigen Dinge, die ich an die Arbeit konnte, wurde behoben. Alles andere wurde als CSVDelimited behandelt. Ich konnte chech dies als die select-Anweisung eine schema.ini Datei wie folgt erstellt:
[MyTable.txt]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=Col1 Char Width 10
Col2=Col2 Integer
Col3=Col3 Char Width 2
Meine Lösung war, meine eigene schema.ini dann die Select-Anweisung verwenden, um zu erstellen. Mein Modul Code etwa wie folgt aussieht:
Option Compare Database
Option Explicit
Public Function CreateSchemaFile(bIncFldNames As Boolean, _
sPath As String, _
sSectionName As String, _
sTblQryName As String) As Boolean
Dim Msg As String
On Local Error GoTo CreateSchemaFile_Err
Dim ws As Workspace, db As Database
Dim tblDef As TableDef, fldDef As Field
Dim i As Integer, Handle As Integer
Dim fldName As String, fldDataInfo As String
' -----------------------------------------------
' Set DAO objects.
' -----------------------------------------------
Set db = CurrentDb()
' -----------------------------------------------
' Open schema file for append.
' -----------------------------------------------
Handle = FreeFile
Open sPath & "schema.ini" For Output Access Write As #Handle
' -----------------------------------------------
' Write schema header.
' -----------------------------------------------
Print #Handle, "[" & sSectionName & "]"
Print #Handle, "CharacterSet = Unicode"
Print #Handle, "Format = Delimited(~)"
Print #Handle, "ColNameHeader = " & _
IIf(bIncFldNames, "True", "False")
Print #Handle, "NumberDigits = 10"
' -----------------------------------------------
' Get data concerning schema file.
' -----------------------------------------------
Set tblDef = db.TableDefs(sTblQryName)
With tblDef
For i = 0 To .Fields.Count - 1
Set fldDef = .Fields(i)
With fldDef
fldName = .Name
Select Case .Type
Case dbBoolean
fldDataInfo = "Bit"
Case dbByte
fldDataInfo = "Byte"
Case dbInteger
fldDataInfo = "Short"
Case dbLong
fldDataInfo = "Integer"
Case dbCurrency
fldDataInfo = "Currency"
Case dbSingle
fldDataInfo = "Single"
Case dbDouble
fldDataInfo = "Double"
Case dbDate
fldDataInfo = "Date"
Case dbText
fldDataInfo = "Char Width " & Format$(.Size)
Case dbLongBinary
fldDataInfo = "OLE"
Case dbMemo
fldDataInfo = "LongChar"
Case dbGUID
fldDataInfo = "Char Width 16"
End Select
Print #Handle, "Col" & Format$(i + 1) _
& "= """ & fldName & """" & Space$(1); "" _
& fldDataInfo
End With
Next i
End With
CreateSchemaFile = True
CreateSchemaFile_End:
Close Handle
Exit Function
CreateSchemaFile_Err:
Msg = "Error #: " & Format$(Err.Number) & vbCrLf
Msg = Msg & Err.Description
MsgBox Msg
Resume CreateSchemaFile_End
End Function
Public Function ExportATable(TableName As String)
Dim ThePath As String
Dim FileName As String
Dim TheQuery As String
Dim Exporter As QueryDef
ThePath = "c:\export\"
FileName = TableName + ".txt"
CreateSchemaFile True, ThePath, FileName, TableName
On Error GoTo IgnoreDeleteFileErrors
FileSystem.Kill ThePath + FileName
IgnoreDeleteFileErrors:
TheQuery = "SELECT * INTO [Text;DATABASE=" + ThePath + "].[" + FileName + "] FROM [" + TableName + "]"
Set Exporter = CurrentDb.CreateQueryDef("", TheQuery)
Exporter.Execute
End Function
Sub ExportTables()
Dim lTbl As Long
Dim dBase As Database
Dim TableName As String
Set dBase = CurrentDb
For lTbl = 0 To dBase.TableDefs.Count - 1
'If the table name is a temporary or system table then ignore it
If Left(dBase.TableDefs(lTbl).Name, 1) = "~" Or _
Left(dBase.TableDefs(lTbl).Name, 4) = "MSYS" Then
'~ indicates a temporary table
'MSYS indicates a system level table
Else
TableName = dBase.TableDefs(lTbl).Name
ExportATable (TableName)
End If
Next lTbl
Set dBase = Nothing
End Sub
Ich mache keine Ansprüche, dass dies elegant, aber es funktioniert. Beachten Sie auch, dass der Stackoverflow Code Formatter nicht meinen \“nicht mag, so ist es nicht recht meinen Code druckt sehr schön.
Andere Tipps
In Bezug auf diesen Thread ich auf eine unglaublich einfache Lösung gestolpert Lage zu sein, eine Spezifikation für alle Tabellen Exporte verwenden, während normalerweise würden Sie ein separates für jeden schaffen müssen; oder die Unterroutine, die von Richard A vorgesehen verwendet werden.
Der Ablauf ist wie folgt:
Erstellen Sie eine Spezifikation beispielsRohr |
mit jedem Tisch begrenzt, öffnen Sie dann eine dynaset Abfrage in SQL Zugriff SELECT * FROM MSysIMEXColumns
verwenden und dann einfach alle resultierenden Zeilen löschen. Nun wird diese Spezifikation nicht Fehler 3011 geben, wenn Sie eine andere Tabelle, das zu verwenden versuchen, die Sie die ursprüngliche Spezifikation erstellen und sind im Wesentlichen eine universelle Rohr Export-Spezifikation für jede Tabelle / Abfrage, die Sie mögen.
Dies wurde in Access 2003 so übernehmen entdeckt / geprüft werde ich auch für spätere Versionen.
Mit freundlichen Grüßen
Matt Donnan
Ich habe zwei Vorschläge für Sie:
-
Achten Sie darauf, auf eine neue Zeile jede Einstellung in Ihrer [schema.ini] Datei setzen sind. (Sie haben es hier aufgelistet alle auf einer Linie, so dass ich dachte, dass ich sicher machen würde.)
-
Vergessen Sie nicht, die Codepage-Argument (letzte), wenn Sie rufen Sie Ihren Transfer zu liefern. Hier ist eine Liste der unterstützten Werte, wenn Sie es brauchen:
http://msdn.microsoft.com/en-us/library /aa288104.aspx
Other than that, es sieht aus wie sollte Ihr Ansatz arbeiten.
Ich habe ein Teil der Antwort bekam:
Ich bin eine schema.ini Datei mit VBA zu schreiben, dann meinen Transfer tun. Dies schafft ein Exportformat on the fly. Das einzige Problem ist, obwohl mein schema.ini enthält:
ColNameHeader = True
CharacterSet = Unicode
Format = Delimited(~)
Nur die Kopfzeile wird in Unicode mit Tilde delimiters herauskommen. Der Rest der Zeilen sind ANSI mit Komma.