Форум » Программистские штучки » Разбор строки текстового файла (VBA) » Ответить

Разбор строки текстового файла (VBA)

administrator: Моя программа рисования карты числа залежей читала два стандартных файла: -файла с числом залежей в формате CSV (или, что почти то же самое, bln) -файла с палеткой Surfer'a в формате CLR (или, что почти то же самое, prn) Для их чтения я написал универсальную разбираловку строк, которой достаточно задать используемый разделитель. Функция возвращает динамический массив строк, каждая из которых - результат прочтения исходной строки от разделителя до следующего разделителя. Она корректно обрабатывает строки без разделителей вообще, строки с последовательными разделителями (считая их одним), строки, кончающиеся на разделитель (отбрасывая его). Нетрудно модифицировать функцию, чтобы можно было задавать - считать последовательные разделители одним или нет, но мне это пока не требовалось. Я не знаю, как задать, что функция возвращает динамический массив, но если не указывать явно, что она возвращает, все работает корректно и на включенном Option Explicit. [pre2] 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 [/pre2]

Ответов - 2

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

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



полная версия страницы