2013-05-21 71 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