Форум

им. Зелёного Батискафа

АвторСообщение
aka RCgoff




Зарегистрирован: 16.05.06

Замечания: Не оффтопь и не указывай
ссылка на сообщение  Отправлено: 22.01.13 19:09. Заголовок: Разбор строки текстового файла (VBA)


Моя программа рисования карты числа залежей читала два стандартных файла:
-файла с числом залежей в формате CSV (или, что почти то же самое, bln)
-файла с палеткой Surfer'a в формате CLR (или, что почти то же самое, prn)

Для их чтения я написал универсальную разбираловку строк, которой достаточно задать используемый разделитель. Функция возвращает динамический массив строк, каждая из которых - результат прочтения исходной строки от разделителя до следующего разделителя. Она корректно обрабатывает строки без разделителей вообще, строки с последовательными разделителями (считая их одним), строки, кончающиеся на разделитель (отбрасывая его).

Нетрудно модифицировать функцию, чтобы можно было задавать - считать последовательные разделители одним или нет, но мне это пока не требовалось.

Я не знаю, как задать, что функция возвращает динамический массив, но если не указывать явно, что она возвращает, все работает корректно и на включенном Option Explicit.
 
Function LineParse(ByVal SrcLn As String, sepr As String)
'разбор строки текстового файла с bln,csv,prn-подобным форматом - Л. Ядренников 21-22.01.2013
'sepr, начинающий строку, и два и более подряд идущих - игнорируются
'sepr - сепаратор, разделитель
'возвращает динамический массив String'ов - разобранную строку

'Производится поиск позиции sepr'a. Если он найден и он не первый, строка до позиции пишется
'в соответствующий элемент динмассива, индекс динмассива увеличивается, исходная строка усекается
'(начинаясь теперь с позиции, следующей за sepr-ом) и процесс повторяется до тех пор, пока sepr'ы не кончатся.
'02.12.2015 added ByVal to prevent rewriting variable

Dim ArrLine() As String 'массив, в который все пихаться будет
Dim SeprPos As Long 'очередная позиция sepr'а
Dim i As Integer 'счетчик фрагментов (записей) в строке и элементов массива ArrLine

If Right(SrcLn, 1) = sepr Then SrcLn = Left(SrcLn, Len(SrcLn) - 1) 'если строка кончается sepr'ом, это надо исправить
i = 1
ReDim ArrLine(1 To 1)

Do
SeprPos = InStr(SrcLn, sepr)
If SeprPos <> 0 Then
ArrLine(i) = ArrLine(i) + Left(SrcLn, SeprPos - 1)
If ArrLine(i) <> "" Then 'переход на новый элемент динмассива только если sepr не лидирующий (не ;;;43 например)
'(это важно, например, в файлах, где разделители - пробелы. В CLR,PRN файлах в частности)
i = i + 1
ReDim Preserve ArrLine(1 To i)
ArrLine(i) = ""
End If
End If
SrcLn = Right(SrcLn, Len(SrcLn) - SeprPos) 'усекаем исходную строку до позиции, следующей за SeprPos
Loop While SeprPos > 0
ArrLine(i) = SrcLn

LineParse = ArrLine
End Function


Лучшим доказательством мудрости служит всегда хорошее расположение духа Спасибо: 0 
Профиль Цитата Ответить
Ответов - 2 [только новые]





Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 24.01.13 16:10. Заголовок: Блин, не могу избави..


Блин, не могу избавиться от навязчивой идеи, что этот код мне не нравится. Скорее всего потому, что сам писал нечто подобное, и сказываются отличия в подходе.
Не очень люблю универсальные плюшки, т.к. (хоть умом и понимаю, что не прав) предпочитаю под каждый формат писать свою читалку.

Спасибо: 0 
Цитата Ответить
aka RCgoff




Зарегистрирован: 16.05.06

Замечания: Не оффтопь и не указывай
ссылка на сообщение  Отправлено: 02.12.15 16:28. Заголовок: Добавлено ByVal во в..


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

Лучшим доказательством мудрости служит всегда хорошее расположение духа Спасибо: 0 
Профиль Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  5 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия