我需要从文本文件创建一个访问(2007)表。我提前知道应该存在哪些列,但供应商有时会失误并提交包含不正确列数的文本文件。所以我不想提前指定列。我想将所有数据作为文本加载到存在的任何列中。然后我会做QC。
列是用竖线分隔的,每条记录有 200 多列。没有列标题,但文件有一行标题文本,最后一行说明有多少记录。文本文件中可能有 1 到 5,000 多条记录。记录用 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
尽管 OLEDB 版本中的“HDR=No”,但两个驱动程序似乎都需要这个来忽略列标题。
我得到的错误是:“无法更新。数据库或对象是只读的”。
我很感激任何帮助。