2013-05-21 150 views
1

我需要從文本文件創建訪問(2007)表。我事先知道應該存在哪些列,但有時供應商會錯過並提交包含不正確列數的文本文件。所以我不想提前指定列。我想將所有數據作爲文本加載到存在的任何列中。然後我會做QC。從文本文件創建訪問表

這些列是管道分隔的,每條記錄有超過200列。沒有列標題,但是文件有一行標題文本,最後一行標明瞭有多少條記錄。文本文件中可能有1到5000個以上的記錄。記錄用CRLF(窗口)標識。

這是我到目前爲止,它的工作原理(它讀取文件並將正確的信息放入記錄集(列和記錄),我可以計算記錄數),除了SELECT INTO給我一個錯誤:

Sub OpenTextADO(strFileName As String, strPath As String) 

    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim fld As ADODB.Field 
    Dim recs As Integer 
    Dim strRecord As String 
    Dim strSQL As String 

    recs = 0 

    Set cn = New ADODB.Connection 

    If Right(strFileName, 3) = "txt" Then 
    'cn.Open "DRIVER={Microsoft Text Driver (*.txt; *.csv)};" & "DBQ=" & strPath & "\" 'need schema.ini file 
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & "\;Extended Properties='text;HDR=No;FMT=Delimited(|)'" 'need schema.ini file 
    End If 

    Set rs = New ADODB.Recordset 
    rs.Open "SELECT * INTO TESTTEXT FROM [" & strFileName & "]", cn, adOpenStatic, adLockOptimistic, adCmdText 


    'Do Until rs.EOF 
    ' For Each fld In rs.Fields 
    ' strRecord = strRecord & "|" & fld.Value 
    ' Next fld 
    ' strRecord = strRecord & vbCr 
    ' recs = recs + 1 
    ' rs.MoveNext 
    'Loop 

    'Debug.Print strRecord 

    'recs = rs.RecordCount 

    rs.Close 
    Set rs = Nothing 
    MsgBox "Text was opened and there are " & recs & " records in the table." 

    cn.Close 
    Set cn = Nothing 

End Sub 

注:我包括OLEDB版本和文本驅動程序版本 - 他們都似乎操作相同。我還創建了一個schema.ini文件,看起來像這樣:

[test.txt] 
Format=Delimited(|) 
ColNameHeader=False 

兩位車手似乎需要這desregard列標題,儘管OLEDB版本的「HDR =否」。

我得到的錯誤是:「無法更新。數據庫或對象是隻讀的」。

我很感激任何幫助。

+0

有多少這些是你在做什麼?使用導入嚮導怎麼樣? – John

+0

我現在使用導入嚮導,但這變得不切實際。我每週開始獲得這些文件中的5或6個,現在我每週得到20-30個,並且可能會獲得更多。 – bassman592

回答

2

您可以使用文件的第一個數據行中的管道分隔字段的計數來創建具有正確列數的表的順序讀取文本文件,然後將後續行寫入該表?我只是把以下內容放在一起,但它似乎工作。

Public Function import_txt_to_db(strFile As String) As Boolean 
On Error GoTo ErrHandle 

Dim strLine As String 
Dim intFileNum As Integer 

Dim blnFirstLine As Boolean 
blnFirstLine = True 

Dim varArray As Variant 

intFileNum = FreeFile 

Open strFile For Input Access Read As intFileNum 

Do While Not EOF(intFileNum) 

    Line Input #intFileNum, strLine 
    varArray = Split(strLine, "|") 

    If blnFirstLine = True Then 
     'Use count of fields in first line to determine # of columns to create 
     Dim intColCount As Integer 
     intColCount = UBound(varArray) 

     Dim strQry As String 
     strQry = "CREATE TABLE tblImport (" 
     Dim intCtr As Integer 
     For intCtr = 1 To intColCount + 1 
      strQry = strQry & "[COLUMN_" & intCtr & "] TEXT(255)," 
     Next intCtr 

     strQry = Left(strQry, Len(strQry) - 1) & ")" 'get rid of terminal comma 

     CurrentDb.Execute strQry 

     blnFirstLine = False 

    End If 

    Dim strQry2 As String 
    strQry2 = "INSERT INTO tblImport VALUES('" & Replace(strLine, "|", "','") & "')" 

    CurrentDb.Execute strQry2 

Loop 

Close #intFileNum 
import_txt_to_db = True 

Exit Function 

ErrHandle: 
import_txt_to_db = False 

End Function 

我做了如下因素五大行的文本文件

Thomas|Jefferson|Virginia 
Bill|Clinton|Arkansas 
Jimmy|Carter|Georgia 
Lyndon|Johnson|Texas 
George|Washington|Virginia 

一個簡單的測試運行代碼後,這裏是我的(簡單)表:

vba-generated table