Моя программа рисования карты числа залежей читала два стандартных файла:
-файла с числом залежей в формате 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