Разбивка строки на слова

Советы » ASCII и CSV » Разбивка строки на слова

Приведу несколько простых функций, позволяющих работать с отдельными словами в строке. Возможно они пригодятся вам для разбивки текстовых полей на отдельные слова (for i := 1 to NumToken do ...) с последующим сохранением их в базе данных.

function

GetToken(aString, SepChar: string

; TokenNum: Byte): string

; { параметры: aString : полная строка SepChar : единственный символ, служащий разделителем между словами (подстроками) TokenNum: номер требуемого слова (подстроки)) result : искомое слово или пустая строка, если количество слов меньше значения 'TokenNum' } var

Token: string

; StrLen: Byte; TNum: Byte; TEnd: Byte; begin

StrLen := Length(aString); TNum := 1; TEnd := StrLen; while

((TNum <= TokenNum) and

(TEnd <> 0)) do

begin

TEnd := Pos(SepChar, aString); if

TEnd <> 0 then

begin

Token := Copy(aString, 1, TEnd - 1); Delete(aString, 1, TEnd); Inc(TNum); end

else

begin

Token := aString; end

; end

; if

TNum >= TokenNum then

begin

GetToken1 := Token; end

else

begin

GetToken1 := ''; end

; end

; function

NumToken(aString, SepChar: string

): Byte; { parameters: aString : полная строка SepChar : единственный символ, служащий разделителем между словами (подстроками) result : количество найденных слов (подстрок) } var

RChar: Char; StrLen: Byte; TNum: Byte; TEnd: Byte; begin

if

SepChar = '#' then

begin

RChar := '*' end

else

begin

RChar := '#' end

; StrLen := Length(aString); TNum := 0; TEnd := StrLen; while

TEnd <> 0 do

begin

Inc(TNum); TEnd := Pos(SepChar, aString); if

TEnd <> 0 then

begin

aString[TEnd] := RChar; end

; end

; Result := TNum; end

; // Или другое решение: function

CopyColumn(const

s_string: string

; c_fence: char; i_index: integer): string

; var

i, i_left: integer; begin

result := EmptyStr; if

i_index = 0 then

begin

exit; end

; i_left := 0; for

i := 1 to

Length(s_string) do

begin

if

s_string[i] = c_fence then

begin

Dec(i_index); if

i_index = 0 then

begin

result := Copy(s_string, i_left + 1, i - i_left - 1); exit; end

else

begin

i_left := i; end

; end

; end

; Dec(i_index); if

i_index = 0 then

begin

result := Copy(s_string, i_left + 1, Length(s_string)); end

; end

;

Я знаю что в GetToken параметр SepChar (в моем случае c_fence) строка, не символ, но комментарий гласит, что функция ожидает единственный символ в этой строке, и это очевидно, поскольку если вы пошлете более одного символа, функция попросту несработает. ( Delete(aString,1,TEnd) будет ошибкой, если Length( SepChar ) > 1 ).

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com