2013-05-21 1 views
1

Мне нужно создать таблицу доступа (2007) из текстового файла. Я заранее знаю, какие столбцы должны существовать, но время от времени поставщики откатываются и отправляют текстовый файл, содержащий неправильное количество столбцов. Поэтому я не хочу указывать столбцы заранее. Я хочу загрузить все данные в виде текста в любые столбцы. Тогда я сделаю КК.Создать таблицу доступа из текстового файла

Столбцы разделены по трубопроводам, и в записи записано более 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 заголовки столбцов, несмотря на «HDR = No» в версии OLEDB.

Ошибка, которую я получаю: «Не удается обновить. База данных или объект доступны только для чтения».

Я ценю любую помощь.

+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

 Смежные вопросы

  • Нет связанных вопросов^_^