![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStringList неправильно разбивает строку по разделителям. [D7, XP]
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>', получить 'Мама мыла', 'раму'