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

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

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

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

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

Если попытаться прилинковать эту таблицу, то Access сразу выдаст мастер импортирования, если делать это на программном уровне, то опять же не очень понятно че там тогда указываешь в TransferText
...
Рейтинг: 0 / 0
11.03.2004, 18:49
    #32438771
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
Код: 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
12.03.2004, 09:44
    #32439173
johnnybo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
я так понимаю marvan дал пример когда в системе установлен аксес,
а как быть когда его нету? у нас не на всех машинах он есть - уж очень он дорогой.
...
Рейтинг: 0 / 0
12.03.2004, 11:19
    #32439422
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
лови чудесную ссылочку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
12.03.2004, 17:21
    #32440452
johnnybo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
за ссылочки спасибо, вторая действительно "сказака"
...
Рейтинг: 0 / 0
15.03.2004, 11:12
    #32441495
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
2marvin: Твой пример абсолютно аналогичен моим рассуждениям, в нем ничего нового.... самое интересное (в чем у нас расхождения) скрывается я так понимаю в строке modBase.GetTab("tXls"), так чтоже там?
...
Рейтинг: 0 / 0
15.03.2004, 11:58
    #32441607
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
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
15.03.2004, 12:41
    #32441710
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
Мдам, в этой функции действительно все достаточно прозрачно, я то все никак не найду где у тебя прогрммно прилинковывается таблица из текстового файла (может я конечно вчера так на отмечался, что чего-то не замечаю :) )

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

- в смысле?! многие системные таблицы можно модифицировать, единственно большинство из них конечно руками не даются, а вот через SQL запрос - пожалуйста - именно это меня спасло, когда испортилась база при копировании, причем и источник и соотв. копия. Полетели все модули и формы. Таблицы мне в ней не особо не интересовали. Оказалось что испортились только имена в записях системной таблицы хранившей системеные объекты, однако бинарное поле, с содержимым модуля было в порядке. Помогло создания в новой базу пустых модулей и обновление бинарных полей через SQL запрос.
...
Рейтинг: 0 / 0
15.03.2004, 13:17
    #32441791
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
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
15.03.2004, 13:49
    #32441863
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
Погоди, погоди, это же всего лишь программное создание спецификации импорта, а как же все-таки происходит линкова твоего текстового файла, меня интересует твоя таблица "tXls", откуда и как она берется... я лично сналача создавал пустую таблица (или просто указывал новое имя, чтобы Access сам создал новую таблицу) куда и будет происходит импорт, ты же писал что используешь именно связанную таблицу..., что ты называешь связанной таблицей?
...
Рейтинг: 0 / 0
15.03.2004, 14:12
    #32441912
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
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
15.03.2004, 14:43
    #32441961
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
импорт txt
А ну теперь в принципе все понятно. Просто я никогда раньше не использовал тип acLink...

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


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