Форум: "Начинающим";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
ВнизTStringList неправильно разбивает строку по разделителям. Найти похожие ветки
← →
DVM © (2009-07-14 00:16) [0]Случайно никто не знает как победить неправильную работу TStringList. Если я указываю Delimiter какой то свой символ, скажем "*", то строку
"мама мыла*раму" он разбивает неправильно. Пробел тоже считается разделителем и получается 3 строки: "мама", "мыла", "раму" вместо по логике двух. Как можно заставить его не считать пробел разделителем?
← →
KilkennyCat © (2009-07-14 00:17) [1]Как именно сие все делается? Код в студию.
← →
Loginov Dmitry © (2009-07-14 00:19) [2]Никогда еще не использовал Delimiter.
List.Text := StringReplace(...) работает прекрасно.
← →
Игорь Шевченко © (2009-07-14 00:23) [3]
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>", получить "Мама мыла", "раму"
← →
DVM © (2009-07-14 00:26) [4]
> KilkennyCat ©
> Как именно сие все делается? Код в студию.
Все ж в вопросе описано:Lines := TStringList.Create;
try
Lines.Delimiter := "*";
Lines.DelimitedText := "мама мыла*раму";
// тут мы имеем три строки вместо двух
finally
Lines.Free;
end;
> Loginov Dmitry ©
> Никогда еще не использовал Delimiter.
Теперь и я не стану, нашел полезную функцию, которая очевидно является затычкой глюка TStringList: ExtractStrings()
← →
DVM © (2009-07-14 00:28) [5]
> Игорь Шевченко ©
Почти тоже самое что ExtractStrings();
← →
Игорь Шевченко © (2009-07-14 00:34) [6]DVM © (14.07.09 00:28) [5]
> Почти тоже самое что ExtractStrings();
совершенно не то же самое. Как только у тебя в тексте появятся кавычки или символы #13 и #10, которые не надо считать разделителями, так ExtractStrings сразу сломается. Я на эти грабли уже наступал.
← →
KilkennyCat © (2009-07-14 00:38) [7]забавно, глянул генофонд...
SetTextStr отличается от SetDelimitedText.... хотя функционал-то должен быть схож.
← →
DVM © (2009-07-14 00:40) [8]
> Игорь Шевченко ©
> Как только у тебя в тексте появятся кавычки или символы
> #13 и #10, которые не надо считать разделителями, так ExtractStrings
> сразу сломается.
У меня как раз там в реальности #13#10 и есть кавычки, звездочку это я для примера взял. Не ломается.
← →
DVM © (2009-07-14 00:41) [9]
> Игорь Шевченко ©
> которые не надо считать разделителями
Для "которые не надо" в ExtractStrings есть параметр специальный же, второй.
← →
Игорь Шевченко © (2009-07-14 00:50) [10]DVM © (14.07.09 00:41) [9]
Может и я чего недоглядел, когда наступил на грабли (это давно было, года 4 назад). В любом случае я вернулся к той функции, которую рекомендую.
← →
DVM © (2009-07-14 00:53) [11]
> Игорь Шевченко ©
За функцию спасибо в любом случае, она более удобная, чем ExtractStrings, т.к. принимает в качестве разделителя строку, а не только символ или наборы символов.
← →
Германн © (2009-07-14 01:11) [12]
> TStringList неправильно разбивает строку по разделителям.
> [D7, XP]
>
> DVM © (14.07.09 00:16)
>
>
Не соглашусь, что "TStringList неправильно разбивает строку по разделителям".
← →
DVM © (2009-07-14 01:24) [13]
> Германн ©
> Не соглашусь
Аргументируй. Почему он считает разделителем то, что я не указывал?
← →
Германн © (2009-07-14 01:43) [14]
> DVM © (14.07.09 01:24) [13]
>
>
> > Германн ©
>
>
> > Не соглашусь
>
> Аргументируй. Почему он считает разделителем то, что я не
> указывал?
Ну, например.
Я лично считаю TStringList, в некоторой степени, "предком" тех компонент, которые могут появиться позже.
← →
KilkennyCat © (2009-07-14 01:49) [15]
> Германн © (14.07.09 01:43) [14]
Это ничего не меняет и не мешает быть глюкам. Я в свое время изрядно "портил генофонд", убирая вот такие казусы.
← →
Германн © (2009-07-14 02:02) [16]
> KilkennyCat © (14.07.09 01:49) [15]
>
>
> > Германн © (14.07.09 01:43) [14]
>
> Это ничего не меняет и не мешает быть глюкам. Я в свое время
> изрядно "портил генофонд", убирая вот такие казусы.
>
Что именно не меняет?И что не мешает?
← →
KilkennyCat © (2009-07-14 02:05) [17]
> Германн © (14.07.09 02:02) [16]
Ты прям как Алмаз...Тот тоже, скажет, я отвечаю, а он переспрашивает, хотя мои слова напрямую касались предыдущих. или я как-то невнятно говорю? так ведь отсутствие зубов на клавиатурной дикции не сказывается :)
← →
Германн © (2009-07-14 02:19) [18]
> KilkennyCat © (14.07.09 02:05) [17]
>
>
> > Германн © (14.07.09 02:02) [16]
>
> Ты прям как Алмаз...Тот тоже, скажет, я отвечаю, а он переспрашивает,
> хотя мои слова напрямую касались предыдущих. или я как-
> то невнятно говорю? так ведь отсутствие зубов на клавиатурной
> дикции не сказывается :)
>
Я как Adder. Ну во всяком случае стараюсь, как Adder. :)
А что там у Вас в Питере творится - это не ко мне.
← →
Anatoly Podgoretsky © (2009-07-14 07:20) [19]Ничего неправильного нет, все работает в соответствие с логикой 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 - это точная его реализация.
← →
KilkennyCat © (2009-07-14 08:04) [20]
> Anatoly Podgoretsky © (14.07.09 07:20) [19]
Понятно, спасибо за информацию.
Непонятно только, почему пробел... или у них пробелом другой пробел?
← →
Anatoly Podgoretsky © (2009-07-14 09:00) [21]Ну я же привел выписку из штатной справке, на человеческом языке написано, что таковы требования формата. Остальную информацию и примеры можно посмотреть в той же справке по TStringList.
Борланд честно выполнил требования SDF - претензий по этой части не должно быть, претензии должны быть по поводу StrictDelimiter
← →
DVM © (2009-07-14 11:01) [22]
> Anatoly Podgoretsky
> Борланд честно выполнил требования SDF
И все же это нелогичное поведение. Методы надо было называть по-человечески.
Понятно, что справку тоже читать надо иногда.
Вон в си++ тамошний StringVector делает все как ожидается.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c