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

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

TStringList неправильно разбивает строку по разделителям. [D7, XP]


Страницы:   1 2

DVM ©   (2009-07-14 00:16:00) 

Случайно никто не знает как победить неправильную работу TStringList. Если я указываю Delimiter какой то свой символ, скажем '*', то строку
'мама мыла*раму' он разбивает неправильно. Пробел тоже считается разделителем и получается 3 строки: 'мама', 'мыла', 'раму' вместо по логике двух. Как можно заставить его не считать пробел разделителем?


DVM   (2009-07-14 11:01:00) [1]


> Anatoly Podgoretsky


> Борланд честно выполнил требования SDF

И все же это нелогичное поведение. Методы надо было называть по-человечески.
Понятно, что справку тоже читать надо иногда.
Вон в си++ тамошний StringVector делает все как ожидается.


Anatoly Podgoretsky   (2009-07-14 09:00:00) [2]

Ну я же привел выписку из штатной справке, на человеческом языке написано, что таковы требования формата. Остальную информацию и примеры можно посмотреть в той же справке по TStringList.
Борланд честно выполнил требования SDF - претензий по этой части не должно быть, претензии должны быть по поводу StrictDelimiter


KilkennyCat   (2009-07-14 08:04:00) [3]


> Anatoly Podgoretsky © (14.07.09 07:20) [19]

Понятно, спасибо за информацию.
Непонятно только, почему пробел... или у них пробелом другой пробел?


Anatoly Podgoretsky   (2009-07-14 07:20:00) [4]

Ничего неправильного нет, все работает в соответствие с логикой SDF и в соответствии с описанием.


> When assigning CommaText, the value is parsed as SDF formatted
> text. For SDF format, strings are separated by commas or
> spaces, and optionally enclosed in double quotes.


Просто желания не совпадают с реальностью, для тех кому надо не стандартное поведение, тот должен переходить на Д2006 - там есть изуродованая функция со StrictDelimiter - но она уже будет работать не по правилам SDF, а этому формату уже не одно десятилетие и используется он очень широко, например в CSV - это точная его реализация.


Германн   (2009-07-14 02:19:00) [5]


> KilkennyCat ©   (14.07.09 02:05) [17]
>
>
> > Германн © (14.07.09 02:02) [16]
>
> Ты прям как Алмаз...Тот тоже, скажет, я отвечаю, а он переспрашивает,
>  хотя мои слова напрямую касались предыдущих.  или я как-
> то невнятно говорю? так ведь отсутствие зубов на клавиатурной
> дикции не сказывается :)
>

Я как Adder. Ну во всяком случае стараюсь, как Adder. :)
А что там у Вас в Питере творится  - это не ко мне.


KilkennyCat   (2009-07-14 02:05:00) [6]


> Германн © (14.07.09 02:02) [16]

Ты прям как Алмаз...Тот тоже, скажет, я отвечаю, а он переспрашивает, хотя мои слова напрямую касались предыдущих.  или я как-то невнятно говорю? так ведь отсутствие зубов на клавиатурной дикции не сказывается :)


Германн   (2009-07-14 02:02:00) [7]


> KilkennyCat ©   (14.07.09 01:49) [15]
>
>
> > Германн © (14.07.09 01:43) [14]
>
> Это ничего не меняет и не мешает быть глюкам. Я в свое время
> изрядно "портил генофонд", убирая вот такие казусы.
>

Что именно не меняет?И что не мешает?


KilkennyCat   (2009-07-14 01:49:00) [8]


> Германн © (14.07.09 01:43) [14]

Это ничего не меняет и не мешает быть глюкам. Я в свое время изрядно "портил генофонд", убирая вот такие казусы.


Германн   (2009-07-14 01:43:00) [9]


> DVM ©   (14.07.09 01:24) [13]
>
>
> > Германн ©
>
>
> > Не соглашусь
>
> Аргументируй. Почему он считает разделителем то, что я не
> указывал?

Ну, например.
Я лично считаю  TStringList, в некоторой степени, "предком" тех компонент, которые могут появиться позже.


DVM   (2009-07-14 01:24:00) [10]


> Германн ©


> Не соглашусь

Аргументируй. Почему он считает разделителем то, что я не указывал?


Германн   (2009-07-14 01:11:00) [11]


> TStringList неправильно разбивает строку по разделителям.
>  [D7, XP]
>
> DVM ©   (14.07.09 00:16)
>
>

Не соглашусь, что "TStringList неправильно разбивает строку по разделителям".


DVM   (2009-07-14 00:53:00) [12]


> Игорь Шевченко ©

За функцию спасибо в любом случае, она более удобная, чем ExtractStrings, т.к. принимает в качестве разделителя строку, а не только символ или наборы символов.


Игорь Шевченко   (2009-07-14 00:50:00) [13]

DVM ©   (14.07.09 00:41) [9]

Может и я чего недоглядел, когда наступил на грабли (это давно было, года 4 назад). В любом случае я вернулся к той функции, которую рекомендую.


DVM   (2009-07-14 00:41:00) [14]


> Игорь Шевченко ©


> которые не надо  считать разделителями

Для "которые не надо" в ExtractStrings есть параметр специальный же, второй.


DVM   (2009-07-14 00:40:00) [15]


> Игорь Шевченко ©


> Как только у тебя в тексте появятся кавычки или символы
> #13 и #10, которые не надо  считать разделителями, так ExtractStrings
> сразу сломается.

У меня как раз там в реальности #13#10 и есть кавычки, звездочку это я для примера взял. Не ломается.


KilkennyCat   (2009-07-14 00:38:00) [16]

забавно, глянул генофонд...
SetTextStr отличается от SetDelimitedText.... хотя функционал-то должен быть схож.


Игорь Шевченко   (2009-07-14 00:34:00) [17]

DVM ©   (14.07.09 00:28) [5]


> Почти тоже самое что ExtractStrings();


совершенно не то же самое. Как только у тебя в тексте появятся кавычки или символы #13 и #10, которые не надо считать разделителями, так ExtractStrings сразу сломается. Я на эти грабли уже наступал.


DVM   (2009-07-14 00:28:00) [18]


> Игорь Шевченко ©

Почти тоже самое что ExtractStrings();


DVM   (2009-07-14 00:26:00) [19]


> KilkennyCat ©  


> Как именно сие все делается? Код в студию.

Все ж в вопросе описано:
Lines := TStringList.Create;
try
 Lines.Delimiter := '*';
 Lines.DelimitedText := 'мама мыла*раму';
 // тут мы имеем три строки вместо двух
finally
 Lines.Free;
end;



> Loginov Dmitry ©  


> Никогда еще не использовал Delimiter.

Теперь и я не стану, нашел полезную функцию, которая очевидно является затычкой глюка TStringList: ExtractStrings()


Игорь Шевченко   (2009-07-14 00:23:00) [20]

procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
 curPos: Integer;
 curStr: string;
begin
 Parts.Clear;
 if Length(S) = 0 then
   Exit;
 Parts.BeginUpdate;
 try
   CurStr:= S;
   repeat
     CurPos:= AnsiPos(Delimeter, CurStr);
     if CurPos > 0 then begin
       Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
       CurStr:= Copy(CurStr, CurPos+Length(Delimeter),
         Length(CurStr)-CurPos-Length(Delimeter)+1);
     end else
       Parts.Add(CurStr);
   until CurPos=0;
 finally
   Parts.EndUpdate;
 end;
end;


можно хоть 'Мама мыла<BR>раму' и указав в качестве разделителя '<BR>', получить 'Мама мыла', 'раму'


Страницы:   1 2

Наверх

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