Кирпич №2 - текстовый парсер

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

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

Кирпич №2 - текстовый парсер

Сообщение alibek » 09.02.2005 (Ср) 12:45

GSerg меня опередил :)
Предлагаю вашему вниманию мой парсер. Он минимально зависим от других модулей (вернее, он вообще не использует внешние функции). В нем есть несколько функций, предназначенных для форматирования текста, но самая главная, это конечно SubstText :)

Итак, краткий обзор (т.к. код практически не комментирован, но он не слишком сложный).

Класс содержит ряд методов и свойств, начинающихся с Field. Все эти методы и свойства служат для того, чтобы загрузить в парсер значения полей; смысл их очевиден из названия. Кроме того, есть метод FieldLoadText и FieldLoadADO, загружающие поля и их значения из текстовой строки и открытого и спозиционированного рекордсета соответственно. Планируется добавить метод FieldLoadMP3.

Есть свойство FormatText, но оно не обязательно, т.к. его можно указать при вызове функции SubstText.

Функции, начинающиеся с Func_ выполняют различные текстовые преобразования, функция Func позволяет вызвать любую из этих функций по имени. Эти функции можно использовать в строке формата SubstText.

Общие функции:

TrimAll(Text, [TrimChars])
Удалить из строки <Text> все символы, перечисленные в <TrimChars>. По умолчанию, <TrimChars> равен пробелу.

Пример использования:
TrimAll("(095) 123-45-67", "()- ") = "0951234567"


FmtString(Text, FormatString, [IgnoreChars])
Форматировать строку <Text> в соответствии со строкой формата <FormatString>; символ "#" в строке формата интерпретируется, как очередной символ из <Text>. Символы, перечисленные в <IgnoreChars> пропускаются при форматировании.

Пример использования:
FmtString("0951234567", "(###) ###-##-##")


FmtText(FormatString, [Arg1, ...])
Форматировать текст согласно строке формата <FormatString>, подставляя аргументы <Arg*>. В некотором смысле, похожа на сишную или паскалевскую printf.
Поля агрументов заключаются в квадратные скобки, сам аргумент начинается с символа "$", затем следует порядковый номер аргумента (начиная с 1). Через запятую следует опциональная строка форматирования, заключенная в одинарные кавычки; строка интерпретируется аналогично функции VB Format$().

Пример использования:
FmtText("Всего выбрано файлов: [$1]; общий размер: [$2,'#,0 \b']", 12, 34223) = "Всего выбрано файлов: 12; общий размер: 34 223 b"


FmtNum(<Value>, [Pad], [Suffix])
Форматирование целого числа <Value>. Число умещается в <Pad> числовых позиций (по умолчанию, три), в конце добавляется символ <Suffix> (по умолчанию, "."). Функция исходит из того, что ширина любого числа в два раза больше ширины пробела добавляет пробелы согласно этому правилу (оно справедливо для шрифтов Tahoma и Verdana). Удобно, когда надо выровнять числа в ListView по правому краю (первый столбец ListView может иметь только выравнивание по левому краю, выравнивание приходится делать пробелами).

Пример использования:
FmtNum(12) = " 12."


FmtName(Name)
Форматирует имя человека в правильном регистре (первая буква в начале слова и после знака дефиса заглавная, остальные маленькие).

Пример использования:
FmtName("алибек-аглы") = "Алибек-Аглы"


FmtInitials(Name)
Форматирует инициалы человека в правильном регистре.

Пример использования:
FmtInitials("алибек-аглы") = "А.-А."


FmtFullName(FullName)
Форматирует полное имя человека (фамилия, имя, отчество) в правильном регистре.

Пример использования:
FmtFullName("иванов семен петрович") = "Иванов Семен Петрович"


FmtShortName(FullName)
Форматирует сокращенное имя человека (фамилия, инициалы имени и отчества) в правильном регистре.

Пример использования:
FmtFullName("иванов семен петрович") = "Иванов С. П."



Теперь основное, сама функция SubstText.

SubstText([sFormat], [SkipIsNullable])
Здесь параметр <sFormat> означает строку форматирования, если он не указан, то используется свойство FormatString. Параметр <SkipIsNullable> возвращает пустую строку, если строка формата не содержит актуальных полей.

В строке формата применяются следующие специальные символы:

\ - escape-символ.
Следующие за ним символы имеют специальное значение. Имеются следующие предопределенные escape-последовательности:
\0 - символ null (ASCII 0)
\t - табуляция (<TAB>)
\n - перевод строки (<CR><LF>)
\*code* - между звездочками указывается код ASCII символа. Если код указан в виде числа, то он интерпретируется как десятичное значение, если указан в виде 0x1234 (префикс 0x, ноль, икс), то он интерпретируется как шестнадцатиричное значение, причем можно указывать более одного символа (hex-dump).
Любые другие символы интерпретируются как литералы. Этот тэг имеет наивысший приоритет и перекрывает все остальные специальные символы.

'text' - текст
Текст, заключенные в одиночные кавычки, никак не интерпретируется и подставляется, как есть. Исключение составляет символ escape, все остальные специальные символы не обрабатываются.

%field% - значение
Вместо поля подставляется значение. Под полем понимается то, что загружалось в LoadFrom* или добавлялось вручную с помощью FieldAdd. Регистр значения не имеет. Если поле не найдено, вместо него подставляется null.

[sub-format] - под-строка
Интерпретируется также, как основная строка формата.
Может содержать поля, причем если поля есть, но ни одно из них не содержит валидного значения (содержат null или поля не существует), то вместо результата подставляется пустая строка. Если внутри подстроки не указаны поля или существует хотя бы одно поле, то подставляется результат согласно стандартным правилам интерпретации.

$func[(arg1,arg2,...)] - пользовательская функция
Функции, выполняющие текстовые преобразования. Все функции начинаются с символа "$" и если функция имеет аргументы, то они указаны в круглых скобках и разделены запятой. Аргументы интерпретируются также, как обычная строка формата (т.е. со специальными символами, полями и т.п.). Если основной аргумент функции - поле, и оно не существует (или содержит null), то результатом функции также будет null, если это не оговорено особо.

Поддерживаются следующие функции:

$abbr(text[,length]) - создать аббревиатуру из <text> (оставить только заглавные буквы). Если <length> указана и длина <text> меньше <length>, то возвращается <text>.
Пример использования:
$abbr('Final Fantasy 8') = "FF8"
$abbr('Final Fantasy 8',20) = "Final Fantasy 8"

$lower(text) - перевести <text> в нижний регистр.
Пример использования:
$lower('test TEXT') = "test text"

$upper(text) - перевести <text> в верхний регистр.
Пример использования:
$upper('test TEXT') = "TEST TEXT"

$proper(text) - сделать первую букву каждого слова в верхнем регистре, все остальные в нижнем. Разделителями слов являются символы: пробел, запятая, точка, точка с запятой, двоеточие, тире, восклицательный знак, вопросительный знак.
Пример использования:
$proper('test TEXT') = "Test Text"

$caps(text) - сделать первую букву каждого слова в верхнем регистре, остальные буквы не менять. В остальном функция эквивалентна $proper().
Пример использования:
$caps('test TEXT') = "Test TEXT"

$num(value,pad-size) - форматировать число <value>, дополнив его нулями слева до величины <pad-size>. Если размер числа превысит <pad-size>, то будет подставлены символы # в количестве, равным <pad-size>. В планах - добавить третий аргумент, представляющий символ, которым число расширяется слева (по умолчанию "0"). Полезно, например, для форматирования номеров треков композиций.
Пример использования:
$pad(7,3) = "001"

$format(value[,format-string]) - полностью эквивалентно функции VB Format$().
Пример использования:
$format(123,'#,0.00') = "123.00"

$fmt(text[,format-string[,ignore-chars]]) - аналогично функции FmtString.
Пример использования:
$fmt('0951234567','(###) ###-##-##') = "(095) - 123-45-67"

$if(value,if-true,if-false) - Если выражение <value> истинно, то подставляется <if-true>, в противном случае подставляется <if-false>. Если <value> не определено или равно null, то это интерпретируется, как "ложь".
Пример использования:
$if(%VIPClient%,'VIP','Not VIP') = "VIP" (если поле VIPClient=True)

$nvl(value,is-null) - если выражение <value> не определено или равно null, то подставляется <is-null>, в противном случае подставляется <value>.
Пример использования:
'Phone: '$nvl(%Phone%,'-') = "Phone: -" (если поле %Phone% не найдено или равно null)

$pad(text,pad-size) - вписать текст <text> в область размером <pad-size> символов. Если <text> короче, он дополняется справа пробелами, если длиннее, то обрезается.
Пример использования:
$pad('test TEXT',6) = "test T"
$pad('test TEXT',12) = "test TEXT "

$left(text,length) - полностью эквивалентно функции VB Left$().
Пример использования:
$left('test TEXT',3) = "tes"

$right(text,length) - полностью эквивалентно функции VB Right$().
Пример использования:
$right('test TEXT',3) = "EXT"


Пока все :)
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 09.02.2005 (Ср) 12:47

Т.к. файлы пока не аттачаться, то выкладываю сюда:
http://alibek09.narod.ru/vb/clsTextParser.zip
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 09.02.2005 (Ср) 13:55

Выкладываю в форум.
Изменена функция $num() (обновлена).
Изменена функция $if(), изменены правила того, что считать за True, а что за False. Если аргумент не удается определить или преобразовать в логическое выражение, то он принимается за null и функция возвращает пустой результат. Если выражение текстовое, то значения "1", "+", "Y", "YES", "TRUE", "ON" или любое числовое выражение интерпретируются как True, выражения "0", "-", "N", "NO", "FALSE", "OFF" как False, все прочие игнорируются.

UPDATES:
Пофиксен баг с добавлением полей. При добавлении поля его имя не сохранялось.
Вложения
clsTextParser.zip
TextParser class, version 0.2.
(5.15 Кб) Скачиваний: 312
Lasciate ogni speranza, voi ch'entrate.

alexanderz
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 16.01.2005 (Вс) 20:30
Откуда: Россия, Пермь

Сообщение alexanderz » 05.03.2005 (Сб) 18:22

Хм... Довольно прилично. Щас проверю как это в риаллайфе действует ;)
http://forum.vbland.net/ - новый форум о программировании на Visual Basic

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 02.05.2005 (Пн) 16:47

Объясните мне что значит "парсер" пожалуста :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.05.2005 (Пн) 16:57

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 02.05.2005 (Пн) 16:59

уууу как интересно :shock: :lol:

yaklit
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 09.09.2006 (Сб) 19:38

Сообщение yaklit » 29.10.2006 (Вс) 20:54

хм а версию в DLL с экспортом этого всего нельзя?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.10.2006 (Вс) 21:11

А DLL то зачем?
Изображение


Вернуться в Кирпичный завод

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList