Форум: "Начинающим";
Текущий архив: 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
Мне тоже интересно…
← →
Сергей М. © (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«sad;asd;
»asdsd«„sad“;»asd«;
> [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.
Незнал…
← →
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