Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разбиение строки в масив [D7]


Страницы:   1 2

Селезин ©   (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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо