Главная страница
    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.049 c
2-1191426525
Max.66RUS
2007-10-03 19:48
2007.10.28
Поиск пути к исполняемому файлу через реестр...


15-1190979232
Megabyte
2007-09-28 15:33
2007.10.28
Компоненты по отправке СМС на моб. тел.


15-1191188968
Kostafey
2007-10-01 01:49
2007.10.28
Опять близиться утро понедельника


4-1177939597
Плиз_не_пинайте
2007-04-30 17:26
2007.10.28
Поиск окон с помощью FindWindow по маске


2-1191594115
Pacific
2007-10-05 18:21
2007.10.28
Что не так?





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