![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбиение строки в масив [D7]
Селезин © (2006-08-21 11:36:00)Тема, наверное, старая и известная. Спрашиваю не ради решения, а ради лучшего решения.
Имеется строка с разделителями внутри (типа 'aa1|bb2|cc3'). Нужно разить ее и загнать в массив ['aa1','bb2','cc3'] в D7. Вариантов решения, конечно, море (насколько я знаю, стандартной функции нет). А как бы это сделать с наименьшими затратами?
Селезин (2006-08-21 14:56:00) [21]Да я уже написал, даже в трех вариантах :)
Просто задумался - может есть более простой путь?
default (2006-08-21 14:09:00) [22]только пусть автор сабжа имеет ввиду, что Classes.ExtractStrings тоже не без греха
" while (InQuote and not (Tail^ in ['''', '"', #0])) or
not (Tail^ in Separators + [ #0, #13, #10, '''', '"']) do Inc(Tail);"
даже по двойной кавычке обрезает...
чтобы разбиение проводилось только по нужным разделителям пиши свою
begin...end (2006-08-21 13:07:00) [23]> Селезин © (21.08.06 12:15) [4]
> А если текст такой (а он почти везде подобный).
> 'Мои имя фамилия отчество#мой адрес#мои интересы#мой e-mail'?
Classes.ExtractStrings
Селезин (2006-08-21 13:05:00) [24]Неа, две минуты, с учетом моей орфографической правильности печати текста. Но меня интересует как-то время выполнения и затребываемая память, а не время создания (о чем специально указал в начале темы).
Плохиш (2006-08-21 12:52:00) [25]
> Селезин © (21.08.06 12:43) [6]
> Еще цитаты надо?
Зачем нам тупые цитаты, мы и в генофонд не гнушаемся заглядывать. Время на создание функции с требуемым Вам результатом 10 минут.
Селезин (2006-08-21 12:43:00) [26]---from http://www.delphikingdom.com/asp/answer.asp?IDAnswer=29705---
Зря смеетесь. Сергей Осколков абсолютно прав. Тупое использование DelimitedText делит не только по знаку деления скажем ";" но и по пробелам. поэтому если строка A;B;C;D может содержать пробелы, то DelimitedText разбивает и по пробелам.
------------------
Еще цитаты надо?
default (2006-08-21 12:21:00) [27]Селезин © (21.08.06 12:15) [4]
ты что с другой планеты явился?
Str.DelimiterL='#';
Селезин (2006-08-21 12:15:00) [28]------------
Tstrings - вместо самопального массива.
Далее
var str:TStrings;
begin
Str:=TStringList.Create;
Str.DelimiterL='|';
Str.DelimitedText:='aa1|bb2|cc3';
end;
-------------
А если текст такой (а он почти везде подобный).
'Мои имя фамилия отчество#мой адрес#мои интересы#мой e-mail'?
Насколько я понял из inet'а, DelimitedText разбивает и по пробелам и по чему-то еще там.
unknown (2006-08-21 11:46:00) [29]Очепятка, Str.Delimiter:='|';
default (2006-08-21 11:46:00) [30]например,
просматриваешь входную строку посимвольно для подсчёта разделителей
потом в соответствии с числом разделителей выделяешь память для нужного числа элементов - строк в массиве
затем опять просматриваешь входную строку посимвольно
как только встретился разделитель выделяешь нужный размер памяти для строки соответствующего элемента массива и копируешь туда(не обязательно побайтово) строку соответствующую разделителю и тд
unknown (2006-08-21 11:45:00) [31]
> Селезин © (21.08.06 11:36)
Tstrings - вместо самопального массива.
Далее
var str:TStrings;
begin
Str:=TStringList.Create;
Str.DelimiterL='|';
Str.DelimitedText:='aa1|bb2|cc3';
end;