powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
25 сообщений из 168, страница 2 из 7
Работа с большими текстовыми файлами.
    #37563575
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все верно
просто под отладчиком по-моему удобнее смотреть
только файл тестовый тогда маленький надо создать чтобы не ждать

в подходе a.readline есть такая проблема
строку Вы прочитали а дальше с ней что-то надо делать
а делать можно только с помощью vb функций а они для данной задачи не подходят
даже если просто писать что-то типа
if mid(str, 1, 1)="A" then
те брать символ из строки и потом его анализировать то будет очень долго тк строк порядка милилиона и каждая строка порядка сотни сиволов
чтобы избежать этого я использую встроенную функцию InStr InStrRev они делают то же сканирование но быстро
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37563582
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Attribute VB_Name = "FileParseM"

это просто не надо писать в файле
но бейсик сам дописывает эту строку откройте нотепадом Ваш файл и увидите то же для любого файла vb
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37563638
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Прошу прощения а Вы код не вредакторе пишите?

Находит быстро, вот я только зря msgbox не заремил :) и doevents не вставил :)
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37563686
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
конечно в редакторе. просто после сохранения я выбираю файл в списке файлов проектов и делаю экспорт. тк я в офисе именно этот пример писал. а в vb6 понятно файл сразу готов.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37563712
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

А вот интересно если парсить в буфере. могу я по мере прохода по буферу повесить на некую строку метку (или запомнить ее позицию) чтобы потом на нее перейти если содержимое секции UserInfo удовлетворяет заданному критерию?
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37563798
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Test02 работает так
1 находит строку "UserInfo"
2 находит символ новой строки сканируя строку в обратном направлении
3 находит символ новой строки сканируя строку в прямом направлении
4 повторяет это до конца файла

соответственно у нас есть позиция начала и конца найденного участка с UserInfo

я не знаю формат файла поэтому я могу знать правильно ли это. может UserInfo буфер может содержать символы новой строки.
но тогда надо просто начало и конец искать по тем сиволам которые указывает на начало и конец записи UserInfo

Когда мы нашли запись с UserInfo мы можем ее обратотать так как нам нужно
Если хотим можем запомнить начало и конец буфер как смещение от начала файла то это lngLineBeginPosition lngLineEndPosition
Опять же самый быстрый метод обработки когда мы найденный буфер сразу анализируем и экспортируем куда нужно если требуется
Просто если запомнить позиции начала конца а потом дополнительно опять как-то обработать найденные записи то получим увеличение времени тк дополнительно время будет тратиться
1 на сохранение найденных позиций в новом файле
2 на чтение найденных позиций из нового файла
3 на чтение найденных записей из исходного файла используя прочитанные на предыдущем шаге позиции начала конца файла
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564369
gacol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

Для работы с большими текстовыми файлами надо использовать регулярные выражения.
(Если VB не поддерживает надо подключить к библиотеку Microsoft VBScript Regular Expression 5.5)
Думаю в программе, за модификацию которой требуют деньги, они используются.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564402
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gacolДля работы с большими текстовыми файлами надо использовать регулярные выражения.
Чушь. Никакой связи между размером файла и использованием регулярных выражений нет.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564507
gacol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Регулярные выражения придумали специально для ускорения работы с большими текстами,
они зайствованы во многих редакторах
Или мы про разное говорим?
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564529
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Регулярные выражения используются для сложных манипуляций с текстом. Объемы текста никак с этими манипуляциями не соотносятся.
Более того, регулярные выражения применимы не всегда, в некоторых случаях (когда нужен стек или когда объемы текстов очень большие) лучше использовать конечные автоматы или потоковую обработку. В случае с XML остаются автоматы без вариантов.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564804
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
парсер,

Добрый день!

А почему выбран бинарный метод обращения к файлу?
И я всетаки не очень понимаю Чем OPEN лучше чем работа с FSO? в принципе я так понимаю во втором случае дополнительно надо объявлять переменные, что чуток больше ест ресурсы. может еще есть причины?
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564815
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

и еще если доступ к файлу открыть в режиме READ пошустрее не будет? или есть ньюансы в работе команды OPEN?(просто из аналогии с ADODB вопрос)
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37564909
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
файл можно читать любой функцией
если помимо чтения надо еще какие-то операции делать с файлами фолдерами то FileSytemObject может быть и удобнее тк в нем много нужных функций для работы с файлами каталогами
если заранее известно что файл текстовый то можно его открывать как текстовый но надо помнить что если в файле открытом как текстовый встретятся какие-то специальные управляющие символы то они будут рассматриваться как управляющие ну и размер считанной строки не совпадет с длиной файла тк символы начала строки преобразовываются
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565293
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menЧем OPEN лучше чем работа с FSO?
Тем, что FSO — лишняя прослойка.
Ну и тем что FSO загружает файл только в строку, а OPEN позволит загрузить файл в байтовый массив.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565717
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Клевета на FSO :) Никто не мешает сделать так:
Код: vbnet
1.
 strBufer=a.readAll 


при этом весь файл будет загружен в строковую переменную
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565734
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

тут скорее будет загвозка как сказал Парсер:
парсересли заранее известно что файл текстовый то можно его открывать как текстовый но надо помнить что если в файле открытом как текстовый встретятся какие-то специальные управляющие символы то они будут рассматриваться как управляющие ну и размер считанной строки не совпадет с длиной файла тк символы начала строки преобразовываются

И то я думаю можно поисследовать этот вопрос. Я за неимением времени исследование отложу покамест, и воспользуюсь предложенным выше примером кода (да и интересно я с буфером первый раз работаю.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565746
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menпри этом весь файл будет загружен в строковую переменную
А я с этим спорю?
Но байтовый массив эффективнее, чем строковая переменная.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565753
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menно надо помнить что если в файле открытом как текстовый встретятся какие-то специальные управляющие символы
Какие? Есть только два специальных управляющих символа (0x0D, 0x0A), которые отмечают конец строки.
Другие символы ничем не мешают.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565799
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Не буду спорить, т.к. я этот вопрос только изучаю. Покамест вродебы получается весьма шустро. А вот кстати нет ли какойнибудь развернутой статейки на эту тему? а то в стандартном учебнике я что то мало что почерпнул. Единственное надо поискать по метке "массивы". может это что еще подскажет.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565835
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитай эту тему: http://bbs.vbstreets.ru/viewtopic.php?f=1&t=43464
Только прочитай до конца.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565894
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Спасибо, а вот сходу вопрос. отобрал я нужный мне кусок лога. Могу я его сразу куском влить в текстовый файл? или писать всетаки надо построчно?
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37565924
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сразу куском.
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37566036
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
УХ ты! Провел сравнительный тест на файлике в 55 Мб. Старая моя прога 4 минуты 43 секунды. С Вашей помощью, новая 1 минута 50 сек. Это конечно не 12 секунд, но более чем двукратное сокращение времени, плюс более точная выгрузка информации это уже не плохо. На всякий случай Если Вас не затруднит гляньте код, межет можно упростить, а следовательно и ускорить. Смущают меня пара моментов.

Код: vbnet
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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
Public Sub Test02()
    Dim strFilePath As String
   
    Dim dtmBegin As Date
    Dim dtmEnd As Date
    Dim dtmDifference As Date


    dtmBegin = Now

    strFilePath = "D:\work\LOGOUTPUT\system\tmp\tmp.txt"
    
    FileParse strFilePath

    dtmEnd = Now
    dtmDifference = dtmEnd - dtmBegin
    MsgBox "time " & Format(dtmDifference, "HH:mm:ss")
End Sub

Private Sub FileParse(ByVal strFilePath As String)
    Dim strBuffer As String

    FileRead strFilePath, strBuffer
    BufferParse strBuffer
End Sub

Private Sub FileRead(ByVal strFilePath As String, ByRef strBuffer As String)
    Dim lngFileLength As Long
    Dim lngFileHandle As Long

    lngFileHandle = FreeFile()
    Open strFilePath For Binary Access Read Shared As lngFileHandle

    lngFileLength = LOF(lngFileHandle)
    strBuffer = String(lngFileLength, 0)

    Get lngFileHandle, , strBuffer
    Close lngFileHandle
End Sub

Private Sub BufferParse(ByRef strBuffer As String)
    Dim CriteryPosition As Long        '-начальная позиция, найденного совпадения по заданному критерию
    Dim LnBeginSectionPos As Long      '-Начальная позиция секции лога
    Dim LnEndSectionPos As Long        '-Конечная позиция секции лога
    Dim lngCurrentPosition As Long     '-Текущая позиция в буфере
    Dim TmpPosition As Long            '-Промежуточная позиция в буфере при поиске начала и конца секции
    Dim strUserInfo As String          '-Переменная критерия поиска
    Dim strLineBegin As String         '-Сстроковое значение означающее начало строки
    'Dim strLineEnd As String           '-Строковое значение означающее конец строки
    Dim SectionBegin As String         '-Строковое значение означающее начало секции лога
    'Dim SectionEnd As String          '-Строковое значение означающее конец секции лога
    Dim strFound As String             '-Отобранная секция лога, подходящая по критерию поиска
    Dim strFileRezPath As String
    Dim FileHandle As Long

    strUserInfo = Me.fld_cliName.Text
    strLineBegin = vbCrLf
    'strLineEnd = vbCrLf
    SectionBegin = ">IncomingTime"
    'SectionEnd = ">OutgoingTime"
    strFileRezPath = "D:\work\LOGOUTPUT\system\tmp\tmp_rez.txt"
    FileHandle = FreeFile()
    Open strFileRezPath For Append Lock Write As FileHandle

    lngCurrentPosition = 1
    Do While lngCurrentPosition <= Len(strBuffer)
        ' ищем совпадения с критерием поиска
        CriteryPosition = InStr(lngCurrentPosition, strBuffer, strUserInfo, VbCompareMethod.vbTextCompare)
        'MsgBox CriteryPosition
        If CriteryPosition = 0 Then
            Exit Do
        End If

        ' если совпадения по критерию найдены ищем начало текущей секции по ">IncomingTime"
        TmpPosition = InStrRev(strBuffer, SectionBegin, CriteryPosition, VbCompareMethod.vbTextCompare)
        If TmpPosition = 0 Then
            Exit Do
        End If
        ' найдя начало строки, содержащей ">IncomingTime" найдем начало секции
        LnBeginSectionPos = InStrRev(strBuffer, strLineBegin, TmpPosition, VbCompareMethod.vbTextCompare)
        If LnBeginSectionPos = 0 Then
            Exit Do
        End If
        'Теперь найдем конец секции лога, искать будем опять по ">IncomingTime" но уже следующим за _
        позицией найденой по критерию поиска.
        ' line end
     
        TmpPosition = InStr(CriteryPosition, strBuffer, SectionBegin, VbCompareMethod.vbTextCompare)
        If TmpPosition = 0 Then
            Exit Do
        End If
        ' найдя начало строки, содержащей ">IncomingTime" найдем конец текущей секции _
        (оно же начало следующей секции)
        LnEndSectionPos = InStrRev(strBuffer, strLineBegin, TmpPosition, VbCompareMethod.vbTextCompare)
        If LnEndSectionPos = 0 Then
            Exit Do
        End If
        
        strFound = Mid(strBuffer, LnBeginSectionPos + Len(strLineBegin), LnEndSectionPos - LnBeginSectionPos - Len(strLineBegin))
        
        'MsgBox strFound
        
        'FileWrite strFileRezPath, strFound
        Print #FileHandle, strFound

        lngCurrentPosition = LnEndSectionPos ' + Len(strLineEnd)
    Loop
    Close FileHandle
End Sub
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37566131
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насколько я понял формат строки для поиска такой
>IncomingTime***UserInfo***LineEnd
где *** любые символы

мне не нравится такое большое время
что-то не так
1 сколько в итоге находится записей нужных?
2 сколько времени занимает поиск если находить только UserInfo
те оставить только это остальное закоментить
CriteryPosition = InStr(lngCurrentPosition, strBuffer, strUserInfo, VbCompareMethod.vbTextCompare) - оставить
эту строку закоментить тоже для этого пункта
strFound = Mid(strBuffer, LnBeginSectionPos + Len(strLineBegin), LnEndSectionPos - LnBeginSectionPos - Len(strLineBegin)) - закоментить
3 "Смущают меня пара моментов" каких?

я когда тестировал создал файл 100 мб и одну запись UserInfo так он читался 15 сек
пока я не вижу откуда появляется столько дополнительного времени
...
Рейтинг: 0 / 0
Работа с большими текстовыми файлами.
    #37566155
парсер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще надо внутренность Do while loop закоментить а потом по логичестким кускам раскоментить чтобы понять какие куски тормозят
при большом количестве найденных записей может тормозить strFound = ... ну и конечно запись в файл но все равно не настолько
диск читается в несколько раз быстрее чем пишется но это 2-4 раза а тут все 10
...
Рейтинг: 0 / 0
25 сообщений из 168, страница 2 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с большими текстовыми файлами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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