2008-10-02 47 views
2

我想從MSAccess2003中導出多個表格的內容。 這些表包含unicode日文字符。 我想將它們存儲爲波形分隔的文本文件。將MSAccess表格導出爲帶有Tilde分隔符的Unicode

我可以使用File/Export手動執行此操作,並在'高級'對話框中選擇代字號作爲字段分隔符,並將Unicode作爲代碼頁。

我可以將其存儲爲Export Specification,但這似乎是表格特定的。

我想用VBA代碼導出很多表。

到目前爲止,我曾嘗試:

子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 

末次

當我運行此我得到一個異常:

運行時錯誤「3011 ': Microsoft Jet數據庫引擎找不到對象「Allowance1#txt」。確保該對象存在,並且拼寫其名稱和路徑名稱corr ectly。

如果我在這一點上調試,TableName是'Allowance1',如預期。

我想我的UnicodeTilde導出規範是特定於表的,所以我不能將它用於多個表。

解決方案是什麼?我是否應該使用除TransferText外的其他內容,或者可能以編程方式創建導出規範?

任何幫助表示讚賞。

回答

2

我終於解決了這個問題。(我現在使用Access 2007,但有同樣的問題與Access 2003)

首先,什麼沒有奏效:

TransferText只會使標題行Unicode和波浪線分隔,即使有正確格式化的schema.ini。 (不,我沒有把它全部在一行,這僅僅是一個格式問題與計算器的HTML。)

[MyTable.txt] 
CharacterSet = Unicode 
Format = Delimited(~) 
ColNameHeader = True 
NumberDigits = 10 
Col1= "Col1" Char Width 10 
Col2= "Col2" Integer 
Col3= "Col3" Char Width 2 

只使用一個select語句:

SELECT * INTO [Text;DATABASE=c:\export\;FMT=Delimited(~)].[MyTable.txt] FROM [MyTable] 

完全忽略了FMT。我發現很難找到有關參數格式的文檔。無論我在FMT參數中輸入什麼內容,唯一可以使用的東西是Fixed。其他一切都被視爲CSVDelimited。我可以再檢查一下這是創建schema.ini文件這樣的select語句:

[MyTable.txt] 
ColNameHeader=True 
CharacterSet=1252 
Format=CSVDelimited 
Col1=Col1 Char Width 10 
Col2=Col2 Integer 
Col3=Col3 Char Width 2 

我的最終解決方案是創建自己的SCHEMA.INI然後使用select語句。我的模塊代碼看起來像這樣:

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 

我沒有聲稱這是優雅的,但它的作品。另外請注意,stackoverflow代碼格式化程序不喜歡我的「,所以它不漂亮打印我的代碼。

0

我已經得到了部分答案:

我正在寫與VBA Schema.ini文件,然後做我的TransferText。這正在創建一個導出格式。唯一的問題是,儘管我的schema.ini包含:

ColNameHeader = True 
CharacterSet = Unicode 
Format = Delimited(~) 

只有標題行出現在帶有波形符號分隔符的unicode中。其餘的行是帶逗號的ANSI。

0

我有兩個建議供您參考:

  1. 確保你把每一個設置在[SCHEMA.INI]文件上一個新行。 (你已經在這裏列出所有的一行,所以我想我會確保。)

  2. 當你調用你的TransferText時,不要忘記提供CodePage參數(最後一個)。下面是支持的值的列表,如果你需要它:

http://msdn.microsoft.com/en-us/library/aa288104.aspx

除此之外,它看起來像你的方法應該工作。

1

關於此線程我偶然發現了一個令人難以置信的簡單的解決方案,可以使用一個在所有表出口規範,而通常你必須爲每一個單獨的一個,或者使用由Richard A.提供的子程序

的過程如下:

創建規範如管|劃界任何表,然後使用SQL SELECT * FROM MSysIMEXColumns在訪問中打開一個動態集查詢,然後簡單地刪除所有結果行。現在這個規範不會給錯誤3011,當您嘗試使用不同的表來創建原始規格時,它基本上是您希望的任何表/查詢的通用管道導出規格。

這已在2003年訪問中發現/測試,所以我認爲它也適用於更高版本。

親切的問候,

馬特·唐南

+0

感謝馬特。從我做這件事以來,這已經過去了很久了,但是當我有一分鐘時,我會試試看。 – 2011-05-24 22:41:33

相關問題