2 / 2 / 0
Регистрация: 15.03.2014
Сообщений: 68
1

Парсинг из текстовой выгрузки в БД аксесс

15.10.2022, 11:55. Показов 2666. Ответов 37
Метки vba (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую!

Имеется необходимость перенести данные из .ТХТ файла в аксесс для дальнейшей обработки и анализа.
Система из которой осуществляется выгрузка в ТХТ, как мне сказали, не использует таблицы для хранения данных,
по этому выгрузка имеет вид, который имеет и с этим ничего нельзя сделать.
По своей структуре ТХТ файл имеет шапку заказа (зелёная рамка) и под ней таблица с данными (см. Рис).
Из шапки необходимо вытянуть значения 4х полей и привязать к ним данные из таблицы ниже,
чтобы получилась "целостная картина" по каждому заказу (видимо будут нужны 2 таблицы с ключевым полем, если да, то предпочтительно использовать текстовый номер заказа).
В ТХТ репорте предполагается нахождение до тысячи таких заказов (вес файла около 800мб), в приложенном образце (см. архив) их десять.
Для ускорения, процесс по импорту данных в аксесс будет осуществлятся мощностями сервера.

Очень надеюсь на вашу помощь, т.к. для меня задача неподъёмная.
Тут видимо нужен какой-то скрипт для парсинга.

Спасибо.
Миниатюры
Парсинг из текстовой выгрузки в БД аксесс  
Вложения
Тип файла: zip ODSCTLall_Sample.zip (84.1 Кб, 26 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2022, 11:55
Ответы с готовыми решениями:

Парсинг текстовой строки
Здравствуйте уважаемые помогите сделать парсинг строки, сижу уже час и не получается его доделать....

Фильтр по выделенному значению на форме Аксесс (открытом Аксесс Runtime 2003)
Форумчане, доброго времени суток! Прошу Вашей помощи! В Форме_1 Аксесс нужно сделать фильтр...

Переделка кода запуска разделенной БД Аксесс под Аксесс- MySQL
Форумчане, доброго времени суток! Есть разделенная БД Аксесс . Таблицы на сервере , интерфейс на...

Использование полей таблицы Аксесс (поле со списком) при заполнении таблицы Иксель.Импорт данных таблицы иксель в БД Аксесс 2003
Доброго всем здоровья! Возникла необходимость организовать обмен данными аксесс 2003 и иксель (...

Не устанавливается Аксесс 2003 , Аксесс рантайм 2003
Форумчане, доброго времени суток! Хотел поставить Аксесс-2003 - не устанавливается. Затем решил...

37
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
15.10.2022, 18:13 2
В прицепе парсер "на скорую руку". формат А2003.
С оптимизацией скорости не игрался, нет большого исходника.
10 заказов у меня распарсил за 0,15 сек.
Если скинете куда-нибудь исходних побольше в архиве, а сюда ссылку, можно будет поиграться.
Вложения
Тип файла: zip Parser.zip (25.3 Кб, 25 просмотров)
0
2 / 2 / 0
Регистрация: 15.03.2014
Сообщений: 68
15.10.2022, 19:08  [ТС] 3
То что надо!
Но с фрагментом выгрузки содержащим чуть больше заказов выдал ошибку см. рис.
Архив с тхт прилагаю.

Спасибо.
Вложения, ожидающие проверки
Тип файла: jpg ParserError.jpg
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
15.10.2022, 22:27 4
Лучший ответ Сообщение было отмечено Eugene-LS как решение

Решение

Вариант с 3 правками:
1. В исходнике забыли/пропустили строку "ORDER DATA CONTINUED ON NEXT PAGE"
2. Конец файла "обрублен" нетипично.
3. Добавил вывод номера обрабатываемой заявки в Левый нижний угол окна Access.

У меня 16 секунд парсит.
Вложения
Тип файла: zip Parser2.zip (26.7 Кб, 21 просмотров)
0
2 / 2 / 0
Регистрация: 15.03.2014
Сообщений: 68
16.10.2022, 20:06  [ТС] 5
Что-то на грани фантистики!
(-:

По ссылке оригинальная выгрузка с которой придётся работать.

К сожалению, при работе с ней тоже не всё ладно, выдаёт ошибку см. рис.
Похоже, что сторка превышает отведённое для неё место в памяти или что-то типа этого.
Кстати, что у вас за машина, которая спарсила предыдущий файл за 16 сек?
У меня на серваке это заняло 31 сек (-;


Спасибо.
Изображения
 
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
16.10.2022, 21:37 6
Цитата Сообщение от ogsv Посмотреть сообщение
Кстати, что у вас за машина, которая спарсила предыдущий файл за 16 сек?
Мой старикашка (по нонешним меркам) уложился в 20 секунд
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
16.10.2022, 21:44 7
Лучший ответ Сообщение было отмечено ogsv как решение

Решение

Попробуйте новый вариант, чуть медленнее, но правдивее парсит.
(по ссылке не пускает, требует авторизоваться)
Вложения
Тип файла: zip Parser4.zip (31.5 Кб, 8 просмотров)
1
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
16.10.2022, 21:46 8
VBA и Jet однопоточные, а на серваке скорее всего многоядерник процессор.
Лучше на двухядернике с высокой частотой, с отключенным гипертрейдингом.

И да, я работаю в RAM-диске, потому может быть чуть быстрее.
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
16.10.2022, 22:07 9
Цитата Сообщение от Jamaica Посмотреть сообщение
Попробуйте новый вариант
На большом файле (пост #5) - вылезла Err 3163
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
16.10.2022, 22:18 10
Евгений, спасибо!
Поправить без исходника не могу.
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
16.10.2022, 22:21 11
Цитата Сообщение от Jamaica Посмотреть сообщение
Поправить без исходника не могу.
Не вопрос!

Много мусора - хорошо жмётся ...
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
16.10.2022, 22:51 12
Благодарю, сейчас гляну.

Добавлено через 25 минут
Мой А2003 поперхнулся на большом файле при считывании файла в переменную.
Видимо, придется делать предварительную "чистку", дабы размер ускромнить.
Подумаю.
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
17.10.2022, 11:52 13
ogsv, предлагаю к просмотру свой вариант "Парсера".
Большой файл (732 МБ ) - вычитывает, но минуты ...
Со средним (58,1 МБ) справляется за нормальные 25 секунд, что дольше чем у ув.Jamaica, но за то тут количества к цифрам преобразовыватся и ещё дополнительные строки импортируются (опционально).
Миниатюры
Парсинг из текстовой выгрузки в БД аксесс  
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
17.10.2022, 11:53 14
Лучший ответ Сообщение было отмечено ogsv как решение

Решение

Вручную прилинковал БИГ файл,
перелопатил процедуру импорта под построчное чтение,
добавил исключений.

Для ускорения записи:
Убрал связь таблиц Orders и Rows,
удалил индекс на поле OrderID таблицы Rows.

Количество записей в таблице Orders: 12 167
Количество записей в Rows: 3 537 189
Время: 515 сек.
Вложения
Тип файла: zip Parser5.zip (32.0 Кб, 13 просмотров)
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
17.10.2022, 12:07 15
Цитата Сообщение от Jamaica Посмотреть сообщение
Количество записей в таблице Orders: 12 167
Сошлось!
Продолжительность: 00:06:44
Обработано записей: 5 893 965
Импортировано:
Документов: 12 167
Записей к ним: 4 341 980
...
Но я доп. строки принимал .
1
2 / 2 / 0
Регистрация: 15.03.2014
Сообщений: 68
17.10.2022, 12:58  [ТС] 16
Jamaica, Eugene-LS,

Ребята, огромное вам спасибо, оба варианта рабочие!
Eugene-LS, отдельное спасибо за интерфейс.

Тему можно закрывать.
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
17.10.2022, 13:17 17
Евгений,
А вы не можете пошаманить процедуру поднятия ADODB рекордсета к выбранному текстовому файлу?
А то у меня ISAM никак найти не может.
У меня с этими спецификациями совсем не алЁ.

Visual Basic
1
2
3
4
5
6
7
8
    Dim objConn As ADODB.Connection
    Dim ConnectString As String
    
    Set objConn = CreateObject("ADODB.Connection")
    ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "D:\Temp\Parser" & ";Extended Properties=text;HDR=No;FMT=Fixed;"
    objConn.ConnectionString = ConnectString
    objConn.Open
    Set rstCRS = objConn.Execute("SELECT * FROM [ODSLafAll.txt]")
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
17.10.2022, 14:51 18
Цитата Сообщение от Jamaica Посмотреть сообщение
А вы не можете пошаманить процедуру поднятия ADODB рекордсета к выбранному текстовому файлу?
Может потом ... как нить ...

Я сильно не уверен что будет быстрее - на загрузку в массив уходит время соизмеримое со скорость чтения с диска.
А тут OLEDB со своими капризами ...
Четвёрку я не смогу - только 12-тую если стану ковыряться.
0
1185 / 421 / 87
Регистрация: 29.03.2016
Сообщений: 1,013
17.10.2022, 16:33 19
ОК!
Не критично.
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
18.10.2022, 04:30 20
Цитата Сообщение от Jamaica Посмотреть сообщение
пошаманить процедуру поднятия ADODB рекордсета к выбранному текстовому файлу?
Пошаманил ...
В результате код:

Visual Basic
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
Private Sub TextFileTo_ADO_Recordset_001(sFilePath$)
Dim cn As Object 'ADODB.Connection - и на позднем связываниии = нормально! :)
Dim rs As Object 'ADODB.Recordset
Dim sVal$, sFolderPath$, sFileName$
Dim lRecCount&
 
Const iStrLen% = 80: Const iStrCiunt% = 15 'Для вывода только
 
'Рубим путь до последнего левого слеша ("\")
    sFolderPath = Mid(sFilePath, 1, InStrRev(sFilePath, "\")) 'Путь к папке
    sFileName = Mid(sFilePath, Len(sFolderPath) + 1)          'Имя файла
 
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
 
'Параметры подключения:
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0;"
         'Путь к папке с файлом - типа : "d:\ ... \"
        .Properties("Data Source") = sFolderPath
        .Properties("Extended properties") = "text;HDR=No;FMT=Delimited;"
        .Open
    End With
 
    rs.CursorLocation = 3    ' 3 = Client (adUseClient)
    sVal = "SELECT * FROM [" & sFileName & "]"
    rs.Open sVal, cn, 3     ' 3 = Static (adOpenStatic)
    lRecCount = rs.RecordCount
    
    sVal = "Набор [rs] содержит: " & lRecCount & _
        "  записей." & vbCrLf & String(iStrLen, "=")
    Debug.Print sVal
 
 
    If lRecCount > 0 Then
        With rs
            Do Until .EOF
                'выводим в оперативное окошко "обрубок" слева
                Debug.Print Mid(rs(0), 1, iStrLen)
                .MoveNext
                If rs.AbsolutePosition > iStrCiunt Then Exit Do
            Loop
        End With
    End If
 
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
 
End Sub

Выдал в оперативное окошко до боли знакомые строчки:
Код
п»ї 10/09/2022                                      SHIPPING ORDER DATA SHEET   
--------------------------------------------------------------------------------
|SAP     |CEOPS     |ORD |SER                 |ORDER     |ORDER     |SHIP |SALES
|ORD NO. |ORD NO.   |TYPE|ORDER               |ANALYST   |ENTRY DATE|PLANT|ORG. 
--------------------------------------------------------------------------------
|918544  |GTFXG     |YIOR|D - High Complex    |N/A       |06/04/2019|ZN   |E849 
--------------------------------------------------------------------------------
|REF NO.  10688410  |SPLT/SIB ORD    __________/ __________                     
--------------------------------------------------------------------------------
|ORDERED BY                                   |CUST ORD NO.                     
|Y838     CATERPILLAR (CHINA) INVESTMENT      |CCIENG2019-35                    
|BEIJING            010  CN   100020          |                                 
|                                             |                                 
--------------------------------------------------------------------------------
|ACCOUNTING MODEL Y851H                       |ENGINEERING MODEL  GS894
1
18.10.2022, 04:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2022, 04:30
Помогаю со студенческими работами здесь

Создать текстовой файл . Переписать из этого файла в новый текстовой файл всех студентов получивших 2,
Создать текстовой файл <студент> (3 столбика: студент, предмет, оценка). Переписать из этого файла...

Скрипт выгрузки
Add-PSSnapin Quest.ActiveRoles.ADManagement $FullPathForResultFile =...

Скрипт выгрузки
Ребят помогите,нужно чтобы скрипт помимо этих данных выгружал ещё и Email . Данные выгружаются из...

Условия выгрузки
Друзья, Всем Доброго Дня. Подскажите, пожалуйста: Нужно выгрузить топ 20 договоров. При...

Автоматизация выгрузки
Всем добрый вечерок! Есть процедура ....после выполнения которой, можно запустить select и...

Парсинг JSON ответа. Парсинг строки с массивами
Есть ответ с сервера в виде json: ,\"Polygon\":,]}", "OrganizationId": 2, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru