Форум: "Основная";
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];
ВнизПодскажите как решить эту задачу с вытаскиванием из строки куска текста. Найти похожие ветки
← →
Dmitriy_R (2002-01-08 14:40) [0]Вот к примеру имеем
Var Buffer: PChar;
a,b,c,d,e: string;
begin
Buffer := Char("12345:67890:abcde:fghiy:");
мне надо получить следующие результаты
a = 12345, b = 67890, c = abcde, d = fghiy.
Тоесть мне надо брать данные с начала до двоеточия,
от первого двоеточия и до второго, и так далее...
← →
Agent Smith (2002-01-08 14:50) [1]Ответ писать неохота, поетому привожу фрагмент кода моей проги по запихиванию в массив данных из Edit"a(от пробела до пробела);
Вроде это та прога, за работаспособность не отвечаю...procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=5;
label
bye;
var
a:array[1..SIZE]of string[5];
i,p:integer;
st:string;
begin
st:=Edit1.text;
for i:=1 to SIZE do
begin
repeat
p:=pos(" ",st);
if p=1
then delete(st,1,1);
until p<>1;
p:=pos(" ",st);
if p>1 then
begin
a[i]:=copy(st,1,p-1);
delete(st,1,p);
end else
begin
a[i]:=st;
delete(st,1,Length(st));
end;
if a[i]="" then
begin
MessageDlg("Введите все элементы массива!",
mtError,[mbOk],0);
Edit1.Text:="";
goto bye;
end;
end;
st:="";
for i:=1 to SIZE do
begin
st:=st+IntToStr(i)+". "+a[i]+#13;
end;
ShowMessage(st);
bye:
end;
← →
Юрий Зотов (2002-01-08 14:58) [2]S - исходная строка.
with TstringList.Create do
try
Text := StringReplace(S, ":", #13#10, rfReplaceAll);
A := Strings[0];
B := Strings[1];
C := Strings[2];
D := Strings[3];
E := Strings[4]
finally
Free
end;
← →
Romkin (2002-01-08 14:59) [3]varString := string(Buffer);
varStringList.Text := stringreplace(varString,":",#13#10,[rfReplaceAll]);
и теперь получили список строк, каждая переменная - в своей строке...
← →
Romkin (2002-01-08 14:59) [4]Опередили...
← →
SergVlad (2002-01-08 15:19) [5]Разбор строки для универсальности лучше делать в TStrings
По аналогии можно сделать и для ch: CharSet
procedure ParseText_(Lines : TStrings; const S : String; const ch: char);
var
x : Integer;
Temp : String;
begin
Lines.Clear;
if (S <> sNULL) then
begin
Temp := sNULL;
for x := 1 to Length(S) do
begin
if (S[x] = ch) then
begin
Lines.Add(Trim(Temp));
Temp := sNULL;
end
else
Temp := Temp + S[x];
end;
if (Temp <> sNULL) then Lines.Add(Trim(Temp));
end;
end; {ParseText_}
← →
Dimka Maslov (2002-01-08 15:24) [6]
procedure ExtractStrings(Str: TString; List: TStrings; Separator: Char);
var
P1, P2: PChar;
begin
List.BeginUpdate;
try
List.Clear;
P1:=PChar(Str);
repeat
P2:=StrScan(P1, Separator);
if P2<>nil then P2^:=#0;
List.Add(P1);
P1:=P2;
Inc(P1);
until P2 = nil;
finally
List.EndUpdate;
end;
end;
← →
Alx2 (2002-01-08 16:07) [7]Раз уж извращаться, то вот еще вариант (естественно, не универсальный, но примеру удовлетворяет):
Var
S :String;
k, start, idx : integer;
strs : array [1..4] of string;
begin
S := "12345:67890:abcde:fghiy:"; // С этим работаем и его же "портим"
start := 1;
idx := 1;
for k := 1 to Length(S) do
begin
if S[k]=":" then
begin
S[k]:=#0;
strs[Start] := Pchar(@S[idx]);
idx := k+1;
inc(start);
end;
end;
Label1.Caption := Strs[1]+", "+Strs[2]+", "+Strs[3]+", "+Strs[4];
end;
← →
Nicolas_ (2002-01-14 17:28) [8]RxLib, модуль StrUtils, функция ExtractWord.
← →
Light Elf (2002-01-14 20:24) [9]Сотворил бы кто нормальный аналог для Perl-функции split.
Передаем ей строку, строку-разделитель и ссылку на array of strings. И последний потом заполняем.
← →
Alx2 (2002-01-15 08:19) [10]>Light Elf © (14.01.02 20:24
см. ответ от Юрий Зотов © (08.01.02 14:58)
Только немного поправить строчку
Text := StringReplace(S, ":", #13#10, rfReplaceAll);
и оформить процедурой.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c