Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

Про TStringList.DelimitedText   Найти похожие ветки 

 
Кевларвестов Семен   (2007-10-03 12:07) [0]

Доброго дня!
Имеется некоторый текст, разделенный точкой с запятой, из коего нужно получить список. И все б было хорошо, но только TStringList зачем-то делит его не только по заданному делиметру но и по пробелам. Избежать этого можно предварительно закавычив нужные куски. Но, в свою очередь, в тексте могут быть кавычки в не предназначенных для этого местах  (да уже, сволочи, попадаются -:( ). Вот собственно вопрос: можно как то заставить stringlist делимитрить текст исключительно по символу Delimiter?


 
Игорь Шевченко ©   (2007-10-03 12:10) [1]

{
 Преобразование строки с разделителями в список строк.
 Параметры:
  Source    - исходная строка.
  Delimiter - строка-разделитель.
  Parts     - список строк, заполняемый функцией. Создается и уничтожается
              вызывающей функцией.
}
procedure StrBreakApart(const Source, Delimeter: string; Parts: TStrings);
var
 curPos: Integer;
 curStr: string;
begin
 Parts.Clear;
 if Length(Source) = 0 then
   Exit;
 Parts.BeginUpdate;
 try
   CurStr:= Source;
   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;


 
Kolan ©   (2007-10-03 12:14) [2]

> [1] Игорь Шевченко ©   (03.10.07 12:10)

Это конечно хорошо, но можно ли сделать сабж  именно с помощью TStringList?

PS
 Мне тоже интересно&#133


 
Сергей М. ©   (2007-10-03 12:15) [3]


> можно как то заставить stringlist делимитрить текст исключительно
> по символу Delimiter?
>


Нельзя.

Но можно на время работы этого сплит-метода заменить пробелы, например, на символ с кодом #255.


 
ЮЮ ©   (2007-10-03 12:22) [4]

> Это конечно хорошо, но можно ли сделать сабж  именно с помощью
> TStringList?

Нет. Достаточно взглянуть на код
procedure TStrings.SetDelimitedText(const Value: string);
где принпдлежность символа к текущему "слову" определяется так:
while (P^ > " ") and (P^ <> Delimiter) do


 
Однокамушкин   (2007-10-03 12:23) [5]

Какая версия Delphi? В новых версиях (2006 и выше) у TStringList вроде как есть булевское свойство StrongDelimiter или что-то типа того, и если оно равно true, пробелы за разделитель не считаются


 
Anatoly Podgoretsky ©   (2007-10-03 12:26) [6]

> Кевларвестов Семен  (03.10.2007 12:07:00)  [0]

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. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored


 
Kolan ©   (2007-10-03 12:35) [7]

> Anatoly Podgoretsky ©   (03.10.07 12:26)

Вот, я в ситуациях как в сабже сначала преобразую строку так:

asdsd&laquo;sad;asd;

&raquo;asdsd&laquo;&#132;sad&#147;;&raquo;asd&laquo;;



> [5] Однокамушкин   (03.10.07 12:23)


TStrings.StrictDelimiter Property

Determines how the Delimiter property is used.
Class
TStrings

Syntax

[Delphi] property StrictDelimiter: Boolean read GetStrictDelimiter write SetStrictDelimiter;

Description
Use this property to specify whether the Delimiter is the only value used within the DelimitedText property. If set to True, individual strings in DelimitedText are separated only by the character that is the value of Delimiter. If set to False, individual strings in DelimitedText can be separated by a space, a non-printable character, or the character that is the value of Delimiter.


Незнал&#133


 
Kolan ©   (2007-10-03 12:36) [8]

Мдаа..
asdsd"sad;asd;

"asdsd""sad";"asd";


 
Игорь Шевченко ©   (2007-10-03 13:15) [9]

Kolan ©   (03.10.07 12:14) [2]


> Это конечно хорошо, но можно ли сделать сабж  именно с помощью
> TStringList?


Я этой функцией пользуюсь уже 11 лет. Не подводила. В качестве разделителя можно указывать и больше одного символа, например

StrBreakApart("text<br>more text<br>once again more text", "<br>", Parts);


 
Плохиш ©   (2007-10-03 15:05) [10]


> Это конечно хорошо, но можно ли сделать сабж  именно с помощью
> TStringList?

А что где-то было заявлено, что TStringList обладает искусственным интеллектом?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
15-1191595206
lookin
2007-10-05 18:40
2007.10.28
Фильм "Русский транзит" - где скачать...


15-1190126099
alex_ant
2007-09-18 18:34
2007.10.28
Поможет ли тут система сопровождения версий?


1-1186701455
Pa5ha
2007-08-10 03:17
2007.10.28
SpinButton, GroupIndex &amp; Parent


2-1191390380
kyn66
2007-10-03 09:46
2007.10.28
TreeView программное управление


15-1190881952
Vlad Oshin
2007-09-27 12:32
2007.10.28
Как забросить Cookie на определенное время? Не получается





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский