Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1247038461
SP
2009-07-08 11:34
2009.09.13
Вопрос по сайту на хостинге


2-1247038910
petr
2009-07-08 11:41
2009.09.13
Запись в реестр


15-1247449853
brother
2009-07-13 05:50
2009.09.13
Про юных хакеров.


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


11-1205672007
Trible
2008-03-16 15:53
2009.09.13
Вопрос по KOLmdvXLGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский