Delimiter i mały problem

0

Witam ponownie!
Mam mały problem ze zmienną zawierającą taką wartość:

tekst1|tekst2|

i potrzebuje wyciągnąć z tego "tekst1" i "tekst2" do osobnych zmiennych.

Próbowałem zrobić to za pomocą dodania tego do TStringList i wyciagania poprzez przypisania Delimitera równego "|" ale nic z tego nie wyszło. Dlatego proszę o pomoc.

0

Nie bede tu pisał gotowca, bo to juz bylo tutaj nie raz. Dam wskazówki.
Poczytaj o takich funkcjach dzialania na tekście:
Pos();
Copy();
Delete();
oraz poczytaj o:
TStringList
lub
Tablice dynamiczne.
Na pewno Ci pomogą w rozwiązaniu tego problemu.

0
Procedure Atomize(S:String;List:TStrings);
var i:Integer;
Temp:String;
begin
Temp:='';
List.Clear;
for i:=1 to Length(S) do
if S[i]<> '|' then Temp:=Temp+S[i] else
  begin
  List.Add(Temp) ;
  Temp:='';
  end;
if Temp<>'' then  List.Add(Temp) ;
end;

P.S Czasem wystarczy po prostu pomyśleć co komputer ma zrobić ;-P
i jakbys To Ty na miejscu kompa zrobił .

0

dzieki za odpowiedz ale myslalem ze da sie to jakos innaczej zrobic niz za pomoca petli w ktorej jest sprawdzany kazdy znak ;)

0

Jeśli jest to tylko zapis < tekst1|tekst2| > to można wykorzystać GetShortHint i GetLongHint czyli:

 GetShortHint('tekst1|tekst2|') daje 'tekst1'
GetLongHint('tekst1|tekst2|') daje 'tekst2|';
0

Minimalnie szybsze



Procedure Atomize(S:String;List:TStrings);
var
 i,start,Len :Cardinal;
begin
start:=1;
Len:=0;
List.Clear;
for i:=1 to Length(S) do
if S[i]= '|' then
  begin
  List.Add(Copy(S,Start,Len)) ;
  Start:=i+1;
  Len:=0;
  end else Inc(Len);
end;

czas przy rozdzieleniu stringa o długości 5120001 bajtów (ms)
123687 Metoda 1
120141 Metoda 2

0

Jest jeszcze jedna metoda, moim zdaniem najprostsza:

var
  s, s2: string;
  sl: TStringList;
begin
  s:='tekst1|tekst2';
  sl:=TStringList.Create;
  sl.text:=s;
  sl.text:=stringReplace(sl.text, '|', #13+#10, [rfReplaceAll]);
  s:=sl.strings[0];
  s2:=sl.strings[1];
  sl.free;
end;

Działa to tak, że do stringList dodajemy cały tekst, następnie delimiter zamieniamy na znaki entera - automatem mamy każdy wyraz w osobnej 'linii'

0

Juhas Najprościej ale najsłabszaz metod Czas łuuu długi (jak sie skończy podam) [green]
na razie obciązenie Cpu 100% ;-P
ide [browar] w miedzyczasie wypic

start o 11 59 mamy 12 08 końca niewidać proc sie grzeje [diabel]

[edited] Czas zabójczy powyżej 15 minut ;/ rezygnuje

0

a nie prościej (nie patrze na czas wykonywania :P):

var
  s,s1, s2:string;

begin
  s:='tekst1|tekst2|';
  s1:=Copy(s, 0, Pos('|', s)-1);
  s2:=Copy(s, Pos('|',s)+1, Length(s)-1); 
end;

nie twierdzę, że to szybkie i eleganckie (i pewnie nadto zalatuje Turbo Pascalem), ale działa. oczywiście zakładając, że rzeczywiście jest to tylko 'tekst1|tekst2|'

1 użytkowników online, w tym zalogowanych: 0, gości: 1