Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
2-1247209825
b/@.
2009-07-10 11:10
2009.09.13
Можно ли возвратить из функции массив ?


15-1248035401
Юрий
2009-07-20 00:30
2009.09.13
С днем рождения ! 19 июля 2009 воскресенье


2-1247507570
AlexDan
2009-07-13 21:52
2009.09.13
странички PageControl..


15-1247250170
Аноним
2009-07-10 22:22
2009.09.13
С днем рождения, Ketmar


2-1247061735
Тунец
2009-07-08 18:02
2009.09.13
Сетевое программирование