KPEATOP писал(а):А как работает Split ? Может кто-нибудь кратко разъяснить? Никогда не пользовался.
Dim strok As String
Dim MyArray() As String
Open Way1 For Input As #1
Do While Not EOF(1)
Line Input #1, strok
MyArray = Split(strok)
Loop
Close #1
Qwertiy писал(а):Split случайно не в VB6 появился? По одной из ссылок так написано...
KPEATOP писал(а):Жаль. А где можно качнуть VB6 ?
KPEATOP писал(а):Жаль. А где можно качнуть VB6 ?
' ПРОЦЕДУРА: делит строку на подстроки по указанному разделителю
' strText - исходная строка
' strSp - разделитель (если не задан, то делит по всем возможным разделителям)
' varMas() - массив с результатом
Public Sub SplitSeparator(strText As String, strSp As String, varMas() As String)
' Переменные
Dim intLen As Integer ' длина строки
Dim strRez As String ' строка результата
Dim intPos As Integer ' позиция разделителя
Dim intBeg As Integer ' позиция налача поиска
Dim intSp As Integer ' длина разделителя
Dim intChr As Integer ' счётчик символов
' Код
' инициализация массива
ReDim varMas(0)
' определение длины текста
intLen = Len(strText)
' выход, если длина равна нулю
If intLen = 0 Then Exit Sub
' определение длины разделителя
intSp = VBA.Len(strSp)
' инициализация строки результата
strRez = ""
' инициализация позиции начала поиска
intBeg = 1
' формирование массива
Do While True
' поиск разделителя
If intSp = 0 Then
For intChr = 32 To 47
intPos = VBA.InStr(intBeg, strText, VBA.Chr(intChr))
If intPos <> 0 Then Exit For
Next
If intPos = 0 Then
For intChr = 58 To 63
intPos = VBA.InStr(intBeg, strText, VBA.Chr(intChr))
If intPos <> 0 Then Exit For
Next
End If
Else
intPos = VBA.InStr(intBeg, strText, strSp)
End If
' выход, если ничего не найдено
If intPos = 0 Then Exit Do
' добавление подстроки в массив
ReDim Preserve varMas(UBound(varMas()) + 1)
varMas(UBound(varMas())) = Mid(strText, intBeg, intPos - intBeg)
' перемещение указателя начала поиска
intBeg = intPos + VBA.IIf(intSp = 0, 1, intSp)
' выход, если конец строки
If intBeg > intLen Then Exit Do
Loop
' добавление последней подстроки
If intBeg <= intLen Then
ReDim Preserve varMas(UBound(varMas()) + 1)
varMas(UBound(varMas())) = Right(strText, intLen - intBeg + 1)
End If
End Sub
aleksmir писал(а):VBA.InStr
aleksmir писал(а):ReDim Preserve varMas(UBound(varMas()) + 1)
Qwertiy писал(а):aleksmir писал(а):VBA.InStr
Почему?
alibek писал(а):aleksmir писал(а):ReDim Preserve varMas(UBound(varMas()) + 1)
Это ужасно. Изменяй массив блочно If N > UBound(array) Then ReDim Preserve array(UBound(array)+50).
По окончании цикла можешь изменить размер массива на актуальный ReDim Preserve array(N).
KPEATOP писал(а):aleksmir , я примерно такой же код с разделителями написал. У меня в текстовом файле много строк и поэтому очень долго работает (520000 строк за 52 минуты, почти час). Как думаешь, долго будет твой код работать с таким количеством строк? Может у тебя быстрее будет? Строки не длиные примерно по 50-55 символов. Если у тебя быстрее будет чем у меня , тогда можно твой код использовать. Могу дать файл с 520000 строками, чтоб ты попробовал время засечь?
KPEATOP писал(а):я примерно такой же код с разделителями написал
aleksmir писал(а):Потому что был случай, когда к проекту подключил библиотеку, у которой некоторые имена совпадали с именами из библиотеки VBA. Было весело. С того момента стараюсь указывать - чьего модуля функция, процедура или метод.
Qwertiy писал(а):Хм.. Не знал, что эти функции относятся к библиотеке VBA...
aleksmir писал(а):Хорошо, что в Visual Basic есть пошаговая отладка строк... этим он мне и нравится.
Qwertiy писал(а):aleksmir писал(а):Хорошо, что в Visual Basic есть пошаговая отладка строк... этим он мне и нравится.
Хм.. Что-то не представляю, а где её нет?
aleksmir писал(а):Собираюсь с VB переходить на PHP
aleksmir писал(а):такой же удобный редактор как в VB5 например (пошаговое выполнение с точками остановка, отображение значений переменных и функций во всплывающих подсказках, внизу окно отладки и окно просмотра локальных переменных).
KPEATOP писал(а):Не совсем понял как это???
KPEATOP писал(а):я примерно такой же код с разделителями написал
alibek писал(а):Ты правда думаешь, что кому-то нужно видеть полмиллиона строк на экране для редактирования?
KPEATOP писал(а):Если понадобятся какие нибудь строки, как их увидеть.
KPEATOP писал(а):А как мне другие строки посмотреть, если понадобятся, из массива загружать другие 80 000, потом другие 80 000 и т.д. ?
alibek писал(а):На экране умещается одна или две сотни строк. Вот и нужно отображать только те строки, которые в данный момент выводятся на экран.
А при скроллинге определять позицию первой отображаемой записи, количество выводимых записей и загружать в грид только их.
Потом можно прикрутить всякие оптимизации типа read-ahead, но для начала научись загружать только то, что действительно нужно.
Сейчас этот форум просматривают: Google-бот и гости: 5