powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / импорт txt
16 сообщений из 16, страница 1 из 1
импорт txt
    #32437898
johnnybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эсть проблема, нужно импортировать в таблицу аксеса даные из текстового файла програмным путем, всего в файле 350000 строк,
если простым перебором каждой строки - это минимум 10 минут(делаю через адо),

может кто-то знает более гуманный способ?
...
Рейтинг: 0 / 0
импорт txt
    #32437933
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создаешь в Access связанную таблицу (DoCmd.TransferText) с указанием на этот файл и далее выполняешь запрос на добавление
...
Рейтинг: 0 / 0
импорт txt
    #32438163
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему сразу связанную?

Я лично просто создавал пустую таблицу (программно) и указывал ее в DoCmd.TransferText и все. Эту таблицу можно рассматривать как темповую или нет, от задачи зависит. Потом запускаешь запросы по уборке мусора из этой таблицы, который всегда обысно присутствует в текстовых файлах.

Текстовый файл с 750 000 строк импортируется на Celeron466 128RAM минут 5-10, больше времени уходит на последующую работу с запросами по уборке мусора, заполнения некоторых доп. полей и т.д.
...
Рейтинг: 0 / 0
импорт txt
    #32438178
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeySVПочему сразу связанную?...Потом запускаешь запросы по уборке мусора из этой таблицы, который всегда обысно присутствует в текстовых файлах.

Для того, чтобы мусор из текстового файла не тащить в таблицу, а с помощью запроса выбрать из него то, что необходимо.
...
Рейтинг: 0 / 0
импорт txt
    #32438192
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял как это делается программно (хотя как и не программно тоже)

Если попытаться прилинковать эту таблицу, то Access сразу выдаст мастер импортирования, если делать это на программном уровне, то опять же не очень понятно че там тогда указываешь в TransferText
...
Рейтинг: 0 / 0
импорт txt
    #32438771
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Public Function ImportTxt(FilePath As String, TopRow As Boolean) As Boolean
    On Error GoTo BkmErr
    Dim RowCount As Long
    Dim iFN As Long
    Dim m_FileSize As Long
    Dim tmpStr1 As String
    Dim tmpStr2 As String
    Dim LastStrNum As Long
    Dim Schema As String
    Dim fName As String
    Dim fPath As String
    fName =  "tmp.txt" 
    fPath = App.Path
    FileCopy FilePath, fPath &  "\"  & fName
    tIni.Seek  "ImportRange" , adSeekFirstEQ
    If tIni!iniVal <> FilePath Or modBase.GetTab( "tXls" ) = False Then
    'диапазон не импортировался
        Dim myDb As Access.Application
        strPath = App.Path & "\xls2dbf.mdb" 'your Accessfile
        Set myDb = CreateObject( "Access.Application" )
        With myDb
        .OpenCurrentDatabase strPath
        If modBase.GetTab( "tXls" ) = True Then
        'если таблица существует - удалить её
            Call modBase.CloseXls
            .DoCmd.DeleteObject acTable, "tXls"
            Start = Timer
            Do While Timer < Start + 4
                DoEvents    ' Передает управление другим процессам.
            Loop
    
        End If
        If tSpc.Index <>  "PrimaryKey"  Then
            tSpc.Requery
            tSpc.Index =  "PrimaryKey" 
        End If
        tSpc.Seek CurShbID, adSeekFirstEQ
        If tSpc!SpecType =  2  Then
            .DoCmd.TransferText acImportFixed, CurShbID,  "tXls" , FilePath
        ElseIf tSpc!SpecType =  1  Then
            .DoCmd.TransferText acImportDelim, CurShbID,  "tXls" , FilePath
        End If
        
        End With
        Set myDb = Nothing
        tIni.Update  "iniVal" , FilePath
    End If
    Start = Timer
    Do While Timer < Start +  4 
        DoEvents    ' Передает управление другим процессам.
    Loop
    Set tXls = New ADODB.Recordset
    With tXls
    .ActiveConnection = CnPro
    If TopRow = False Then
        .Source =  "tXls" 
    Else
        .Source =  "SELECT TOP 30  * FROM tXls"
    End If
    .CursorType = adOpenKeyset
    .LockType = adLockOptimistic
    .CursorLocation = adUseServer
    .Open
    End With
    ImportTxt = True
    Exit Function
BkmErr:
    ImportTxt = False
End Function
...
Рейтинг: 0 / 0
импорт txt
    #32439173
johnnybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я так понимаю marvan дал пример когда в системе установлен аксес,
а как быть когда его нету? у нас не на всех машинах он есть - уж очень он дорогой.
...
Рейтинг: 0 / 0
импорт txt
    #32439422
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лови чудесную ссылочку1:
h**p://home.pacbell.net/cetta/dabaseII.html
-обрати внимание на "Importing Data II"

лови чудесную ссылочку2:
h**p://www.experts-exchange.com/Databases/MS_Access/Q_20846393.html
-это вообще сказка!

лови чудесную ссылочку3:
h**p://www.google.com.ru/search?q=ADOX.Table+DoCmd.TransferText&ie=UTF-8&oe=UTF-8&hl=ru&lr=
-собственно, где искать в следующий раз.
...
Рейтинг: 0 / 0
импорт txt
    #32440452
johnnybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за ссылочки спасибо, вторая действительно "сказака"
...
Рейтинг: 0 / 0
импорт txt
    #32441495
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2marvin: Твой пример абсолютно аналогичен моим рассуждениям, в нем ничего нового.... самое интересное (в чем у нас расхождения) скрывается я так понимаю в строке modBase.GetTab("tXls"), так чтоже там?
...
Рейтинг: 0 / 0
импорт txt
    #32441607
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergeySV:
в функции ничего особенного.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
'функция проверки наличия таблицы по её имени
Public Function GetTab(TabNm As String) As Boolean
    Dim dRs As ADODB.Recordset
    GetTab = False
    Set dRs = CnPro.OpenSchema(adSchemaTables)
    Do Until dRs.EOF
        If dRs!TABLE_TYPE = "TABLE" Or dRs!TABLE_TYPE = "LINK" Then
             If dRs!TABLE_NAME = TabNm Then
             'обнаружена таблица
'                dRs.Delete
                GetTab = True
                Exit Do
             End If
        End If
        dRs.MoveNext
    Loop
    dRs.Close
End Function


вся соль и изюминки в следующем:
tSpc - системная таблица Access "MSysIMEXSpecs" в которую из программы записываются настройки файла, а настройки колонок пишутся в таблицу "MSysIMEXColumns"
Редкий случай, когда Access позволяет модифицировать свои системные таблицы.
...
Рейтинг: 0 / 0
импорт txt
    #32441710
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдам, в этой функции действительно все достаточно прозрачно, я то все никак не найду где у тебя прогрммно прилинковывается таблица из текстового файла (может я конечно вчера так на отмечался, что чего-то не замечаю :) )

>>Редкий случай, когда Access позволяет модифицировать свои системные таблицы

- в смысле?! многие системные таблицы можно модифицировать, единственно большинство из них конечно руками не даются, а вот через SQL запрос - пожалуйста - именно это меня спасло, когда испортилась база при копировании, причем и источник и соотв. копия. Полетели все модули и формы. Таблицы мне в ней не особо не интересовали. Оказалось что испортились только имена в записях системной таблицы хранившей системеные объекты, однако бинарное поле, с содержимым модуля было в порядке. Помогло создания в новой базу пустых модулей и обновление бинарных полей через SQL запрос.
...
Рейтинг: 0 / 0
импорт txt
    #32441791
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergeySV:

Пример записи в системные таблицы:
(расположено в разных местах, поэтому привожу отдельные моменты)

...
tRaz.Source = "MSysIMEXColumns"
...
tSpc.Source = "MSysIMEXSpecs"
...
tSpc.AddNew "SpecName", mShbID
tSpc.Update "DateDelim", "."
tSpc.Update "DateFourDigitYear", -1
tSpc.Update "DateLeadingZeros", 0
tSpc.Update "DateOrder", 0
tSpc.Update "DecimalPoint", ","
tSpc.Update "FieldSeparator", ";"
tSpc.Update "FileType", 866
tSpc.Update "SpecID", CurShbID
tSpc.Update "SpecType", 2
tSpc.Update "StartRow", 0
tSpc.Update "TextDelim", ""
tSpc.Update "TimeDelim", ":"
...
tRaz.AddNew Array("Attributes", "DataType", "FieldName", "IndexType", "SkipColumn", "SpecID", "Start", "Width"), Array(0, 10, i + 1, 0, 0, CurShbID, 0, 0)
...
...
Рейтинг: 0 / 0
импорт txt
    #32441863
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди, погоди, это же всего лишь программное создание спецификации импорта, а как же все-таки происходит линкова твоего текстового файла, меня интересует твоя таблица "tXls", откуда и как она берется... я лично сналача создавал пустую таблица (или просто указывал новое имя, чтобы Access сам создал новую таблицу) куда и будет происходит импорт, ты же писал что используешь именно связанную таблицу..., что ты называешь связанной таблицей?
...
Рейтинг: 0 / 0
импорт txt
    #32441912
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergeySV:
Прошу прощения. Только сейчас понял, что выдал не тот фрагмент.
Дело давнее, а проект, в котором это было - не маленький.
С прилинкованными таблицами рабо шла в другой процедуре.
Вот её фрагмент:
...
If tSpc!SpecType = 2 Then
.DoCmd.TransferText acLinkFixed, CurShbID, "tLinc", fPath & "\" & fName
ElseIf tSpc!SpecType = 1 Then
.DoCmd.TransferText acLinkDelim, CurShbID, "tLinc", fPath & "\" & fName
End If
...
...
Рейтинг: 0 / 0
импорт txt
    #32441961
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну теперь в принципе все понятно. Просто я никогда раньше не использовал тип acLink...

В принципе я не вижу особой разницы между acLink... и acImport..., единственное различие, что получаемая таблица остается связанной с исходным текстовым файлом - кому-то может это будет очень необходимо, а в моей пока практике я текстовые после импорта в базу вообще удаляю.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / импорт txt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]