Самый быстрый способ разбора строки с разделителем?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Самый быстрый способ разбора строки с разделителем?

Сообщение Matew » 21.12.2005 (Ср) 4:15

Я делаю так:
Код: Выделить всё
Funcnion Perevennaya(ByRef FileA As String, Razd As String) As Single
    Dim nch As Long ' положение разделителя
    nch = InStr(1, FileA, Razd)
    Perevennaya = CSng(Mid$(FileA, 1, nch - 1))
    FileA = Mid$(FileA, nch + 1)
End Sub

Но ооочень сильно тормозит, строка невероятной длины. Можно как-то побыстрее сделать? Например через CopyMemory. Мож есть что-то готовое?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2005 (Ср) 8:31

Неправильно делаешь, потому и тормозит.
Код: Выделить всё
Sub Perevennaya(ByRef FileA As String, Razd As String, Results() As Single)
  Dim P0 As Long, P As Long, I As Long, L As Long, S As Long
  ReDim Results(0 To 100)
  L = Len(FileA)
  S = Len(Razd)
  I = 0
  P0 = 1
  Do Until P0 > L
    I = I + 1
    P = InStr(P0, FileA, Rasd, vbBinary)
    If P = 0 Then P = L + S
    Results(I) = Val(Mid$(FileA, P0, P - P0))
    P0 = P + S
  Loop
  Results(I) = Val(Mid$(FileA))
  ReDim Preserve Results(0 To I)
End Sub
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 10:24

alibek писал(а):Неправильно делаешь, потому и тормозит.


Ну ладно... А чем обычный Split-то хуже?

Вряд ли строка настолько длинна что памяти для массива не хватит.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2005 (Ср) 10:43

Да не люблю я Split :)
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 10:47

alibek писал(а):Да не люблю я Split :)


Да я его тоже не люблю. Какого-то он пола не того...

Но при чем тут телячьи нежности? Жизнь он облегчает, а больше мне от него ничего и не нужно. Работает беспроблемно. Там где его использовал его хватало на все 100. Вот так и живем, хотя друг друга не любим :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 10:53

alibek, Andrey Fedorov Я бы так сделал, но строка имеет вид "что-то_Разделитель1_..... что-тоеще_ Разделитель2 и т.д." , т.е. в строке несколько разделителей и писать надо не только в массивы, а во всякие переменные(в том числе и в массивы). Как с этим бороться?

2All Mid$ сделан через CopyMemory? Т.е. если сделать через CopyMemory будет быстрее?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2005 (Ср) 10:57

Есть какая-нибудь закономерность в смене разделителей?
Если да, то код переписать таким образом:
Код: Выделить всё
Sub Perevennaya(ByRef FileA As String, Results() As Single)
  Dim P0 As Long, P As Long, I As Long, L As Long, S As Long, D As String
  ReDim Results(0 To 100)
  L = Len(FileA)
  I = 0
  P0 = 1
  Do Until P0 > L
    I = I + 1
    D = Choose(I, "div1", "div2", "div3", "div4")
    S = Len(D)
    P = InStr(P0, FileA, D, vbBinary)
    If P = 0 Then P = L + S
    Results(I) = Val(Mid$(FileA, P0, P - P0))
    P0 = P + S
  Loop
  Results(I) = Val(Mid$(FileA))
  ReDim Preserve Results(0 To I)
End Sub
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 11:00

Matew писал(а):alibek, Andrey Fedorov Я бы так сделал, но строка имеет вид "что-то_Разделитель1_..... что-тоеще_ Разделитель2 и т.д." , т.е. в строке несколько разделителей и писать надо не только в массивы, а во всякие переменные(в том числе и в массивы). Как с этим бороться?


Несколько разделителей это как? А то ведь можно:

Код: Выделить всё
s = "12;34-45|56"
v = Split( Replace(Replace(s, "|", ";"), "-", ";"), ";")


Matew писал(а):2All Mid$ сделан через CopyMemory? Т.е. если сделать через CopyMemory будет быстрее?


Быстрее... Сколько мегабайт тебе надо обработать подобным образом?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 11:30

Разделители могут повторятся. Например 1!2?3?4%5!6% :( . И как потом резать этот массив на отдельные переменные и/или массивы?
Быстрее... Сколько мегабайт тебе надо обработать подобным образом?

Речь идет о ~1000 полях длиной по ~2кб каждая, формата [3-4 цифры, разделитель]. Грузится до 15 сек примерно на селероне 2000, а это много. От этого зависит обновление картинок на форме :(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 11:37

Matew писал(а):Разделители могут повторятся.


Они и должны повторяться.

Matew писал(а):Например 1!2?3?4%5!6% :( .


И что тут разделители?

Matew писал(а): И как потом резать этот массив на отдельные переменные и/или массивы?


IMHO По вкусу.

Matew писал(а):Речь идет о ~1000 полях длиной по ~2кб каждая, формата [3-4 цифры, разделитель]. Грузится до 15 сек примерно на селероне 2000, а это много. От этого зависит обновление картинок на форме :(


Тебе что, сразу все 1000 полей загрузить надо?
И при чем тут картинки? В этих полях ссылки на них?

Пример такого файла привел бы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 11:43

1!2?3?4%5!6% разделители !,?,%.
Когда-то давно пытался сделать векторную графику. И не нашел ничего лучше, чем хранить в файле координаты всех точек через разделитель. Каждое поле - это элемент (сложный полигон) на форме.
Теперь этот проект должне обрести вторую жизнь. Вот и думаю...
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 11:50

Matew писал(а):1!2?3?4%5!6% разделители !,?,%.
Когда-то давно пытался сделать векторную графику. И не нашел ничего лучше, чем хранить в файле координаты всех точек через разделитель. Каждое поле - это элемент (сложный полигон) на форме.
Теперь этот проект должне обрести вторую жизнь. Вот и думаю...


Я бы рекомендовал попытаться все это дело преобразовать в один из стандартных форматов и уже их использовать. Если уж очень хочется, то тот-же emf, к примеру. Все-же самопальные велосипеды довольно часто с колесами некруглой формы получаются...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 11:52

Формат такой :число_njxtr*x1#x2#x3#y1#y2#y3#число_ещеЧегонить+x1*x2*y1*y2*переменная1^перменная2% и т.д. точно не помню.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 11:55

Я бы рекомендовал попытаться все это дело преобразовать в один из стандартных форматов и уже их использовать. Если уж очень хочется, то тот-же emf, к примеру. Все-же самопальные велосипеды довольно часто с колесами некруглой формы получаются...

ВСЕ должно редактироваться, а разбриться в чужом формате и тем более его редактировать слишком трудоемко.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 12:17

Matew писал(а):ВСЕ должно редактироваться, а разбриться в чужом формате и тем более его редактировать слишком трудоемко.


Зачем тебе вообще разбираться в формате?
В самом примитивном случае ищешь нормальный редактор и вызываешь его для редактирования твоего файла.

Несколько другой случай когда файл рисунка должен динамически генериться по данным получаемой программой, но и тут я бы предпочел разобраться с одним из стандартных форматов, а не изобретать свой.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 15:55

И все же мне придется ехать на квадратных колесах...
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2005 (Ср) 16:01

Matew писал(а):И все же мне придется ехать на квадратных колесах...


Остается пожелать - с разбегу и посильней отталкиваться... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2005 (Ср) 16:16

Я себя уже разогнал, вы тоже, похоже чуть-чуть как минимум проеду :D
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Sur
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 91
Зарегистрирован: 14.07.2003 (Пн) 20:54
Откуда: C2H5OH

Сообщение Sur » 22.12.2005 (Чт) 17:07


Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 23.12.2005 (Пт) 3:12

Sur Прикольная функция.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 23.12.2005 (Пт) 8:27

Matew писал(а):Sur Прикольная функция.


А вообще - чем заниматься мазохизмом с разбором строки хранил бы данные своих рисунков в бинарном формате. Никаких проблем с их загрузкой/выгрузкой - сразу читаются в переменную нужного тебе типа. Так делают все нормальные программы. Или не знаешь как это?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 25.12.2005 (Вс) 19:22

Я знаю так можно в файл писать. А как писать в переменную?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 26.12.2005 (Пн) 9:39

Matew писал(а):Я знаю так можно в файл писать. А как писать в переменную?


Писать - Put, читать Get.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 27.12.2005 (Вт) 3:17

Andrey Fedorov писал(а):
Matew писал(а):Я знаю так можно в файл писать. А как писать в переменную?


Писать - Put, читать Get.


Я облазил все, что мог, но не нашел про запись в переменную, вот в файл наздоровье.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 27.12.2005 (Вт) 3:27

А как читать/писать вот такой тип:
Код: Выделить всё
Type Element
    pt() As POINTAPI
    nomVBaze As String
    lnum As Long '(кол-во точек в массиве pt)
End type
Dim masElementov() As Element
' объявление
ReDim Preserve masElementov(100)
' Здесь заполняем все lnum
for i=1 to 100
ReDim Preserve masElementov(i).pt(masElementov(i).lnum)
next i

Это мой двумерный полностью динамический массив :)
Не будет проблем, что строка и массивы неопределнной длины?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.12.2005 (Вт) 9:43

Matew писал(а):
Andrey Fedorov писал(а):
Matew писал(а):Я знаю так можно в файл писать. А как писать в переменную?


Писать - Put, читать Get.


Я облазил все, что мог, но не нашел про запись в переменную, вот в файл наздоровье.


См ответ от GSerg в данной ветке:

http://bbs.vbstreets.ru/viewtopic.php?t=22087

Причем переменная твоего типа может содержать массивы других твоих типов. То бишь в ней целиком может быть описание твоего рисунка. Включая имя автора. :lol: Делов-то...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 27.12.2005 (Вт) 9:50

Причем переменная твоего типа может содержать массивы других твоих типов.

Так она и содержит. :) А как при загрузке переобъявить все массивы?

В примере тоже запись в файл(и там кстати строка фиксированной длины). В переменную значит нельзя, а мне надо пихать строку в БД. :(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.12.2005 (Вт) 9:53

Matew писал(а):
Причем переменная твоего типа может содержать массивы других твоих типов.

Так она и содержит. :) А как при загрузке переобъявить все массивы?


Достаточно объявить переменную твоего типа.

Matew писал(а):В примере тоже запись в файл(и там кстати строка фиксированной длины). В переменную значит нельзя, а мне надо пихать строку в БД. :(


Там чтение из файла в переменную. См. внимательней.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 27.12.2005 (Вт) 9:58

Там чтение из файла в переменную. См. внимательней.

Мне надо сформировать строку, которую я запишу в БД. Потом считаю из БД и опять разберу. Т.е. бинарные файлы мне не подходят. :(
Код: Выделить всё
Достаточно объявить переменную твоего типа.

Тогда я не понимаю как это работает на уровне компилятора. Но если это так, то я удивлен. Зачем же тогда все ReDim-ы в других местах?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.12.2005 (Вт) 10:14

Matew писал(а):Мне надо сформировать строку, которую я запишу в БД. Потом считаю из БД и опять разберу. Т.е. бинарные файлы мне не подходят. :(


Не, ну ты точно мозахист... Нафига тебе строка? В базу прекрасно пишется бинарник (как и читается из нее). Он на порядок компактней строки и не требует никаких разборок.

Держи пример (тут не в базу а в файл/из файла, но сути не меняет):

Код: Выделить всё
Public Type TLine
    Name As String
    x As Single
    y As Single
    w As Single
    c As Long
End Type

Public Type TLayers
    Layer As String
    mLines() As TLine
End Type

Public Type TPicture
    Title As String
    Author As String
    Layers() As TLayers
End Type

Public Sub Main()
    SaveP
    LoadP
End Sub

Public Sub LoadP()
    Dim p As TPicture, s As String, iHFile As Integer, i As Integer, j As Integer
    s = App.Path & "\Test.ppp"
   
    iHFile = FreeFile
    Open s For Binary As #iHFile
    Get #iHFile, , p
    Close #iHFile

    Debug.Print p.Title, p.Author
    For i = 0 To UBound(p.Layers)
        With p.Layers(i)
            Debug.Print .Layer
            For j = 0 To UBound(.mLines)
                With .mLines(j)
                    Debug.Print .Name, "x=" & .x, "y=" & .y
                End With
            Next j
        End With
    Next i
End Sub

Public Sub SaveP()
    Dim p As TPicture, i As Integer, iHFile As Integer, s As String, j As Integer
   
    p.Title = "Мой рисунок"
    p.Author = "Остап Бендер"
    ReDim p.Layers(1)
   
    For i = 0 To UBound(p.Layers)
        With p.Layers(i)
            .Layer = "Слой " & i + 1
            ReDim .mLines(2)
            For j = 0 To UBound(.mLines)
                With .mLines(j)
                    .Name = "Line " & j
                    .x = j
                    .y = j
                    .w = 1
                    .c = vbRed
                End With
            Next j
        End With
    Next i
   
    s = App.Path & "\Test.ppp"
   
    iHFile = FreeFile
    Open s For Binary As #iHFile
    Put #iHFile, , p
    Close #iHFile
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 99

    TopList