String, dzielenie do znaku

0

Czołem

Mam taki maleńki problemik, dotyczący łańcucha.

Przyjmując że w komórce mam wpisane dane np. x+;x-;x;
Każda wartość jest oddzielona znakiem ; a wpisanych danych w takiej formie może być od kilku do kilkunastu.
I teraz moje pytanie.

Jak mam podzielić ten string na części tak abym później mógł wypisać każdą wartość oddzielnie.

P.S. Nie chcę gotowca ale podpowiedzi jak to ugryźć.

Dziękuję za odpowiedzi i pozdrawiam
B.

0

Najlepiej zrobić sobie funkcję w stylu:

function Explode(Str : string; Separator : string) : TStringList;

Ponieważ nie chcesz gotowca to powiem Ci jak ona ma działać
Tworzysz obiekt wynikowy
Zmiennej nazwijmy ją X podajesz pozycje separatora w tekstcie Str.
W pętli najlepiej while dopóki X jest większe od zera (czyli znaleziono separator):
Dodaj do obiektu wynikowego skopiowany tekst od pierwszego znaku do X - 1.
Jezeli X jest mniejsze lub równe długości ciągu to do ciągu Str skopiuj tekst od:
X + Długośc separatora, kopiuj ilośc znaków "do oporu" (można dac długośc ciągu).
Zmiennej X przypisz pozycje Separatora w ciągu znaków.
Koniec pętlili while.
Jeżeli długość ciągu jest większa od zera to do obiektu wynikowego dodaj ten ciąg.
Koniec funkcji. I łatwiej było by mi wkleić gotowca, to byś zrozumiał ideę.
Ale skoro ambitnie wolisz opis to go masz powyżej. Teraz tylko przetłumacz go na Delphi.

0

Dziękuję za pomoc. Wszystko działa

0

Można również do tego celu użyć:

TStringList.Delimiter;
TStringList.DelimitedText;
var
  cars : TStringList;            // Define our string list variable
  i    : Integer;
begin
  // Define a string list object, and point our variable at it
  cars := TStringList.Create;

  // Now add some cars to our list - using the DelimitedText property
  // with overriden control variables
  cars.Delimiter := ' ';        // Each list item will be blank separated
  cars.QuoteChar := '|';        // And each item will be quoted with |'s
  cars.DelimitedText := '|Honda Jazz| |Ford Mondeo| |Jaguar "E-type"|';

  // Now display these cars
  for i := 0 to cars.Count-1 do
    ShowMessage(cars[i]);       // cars[i] equates to cars.Strings[i]

  // Free up the list object
  cars.Free;
end;
0

Młody: wszystko fajnie. Jednak zauważyłem rozwiązując zadania maturalne z tego roku i używając TStringList, kiedy dałem Delimiter := ';' to kod nie działal prawidlowo, a dane wyglądały w pliku na przykład tak 1;wyżeł węgierski krótkowłosy;4;samica;1;o059. Mogę się mylić i może ja coś przeoczyłem albo źle użyłem, może to bug w Delphi 7 Personal, ale wolę wtedy uyżyc funkcji Explode, która działa tak, jak opisałem pytającemu - powyżej.

0

Możesz również użyć funkcji
PosEx(CzegoSzukasz,GdzieSzukasz,ZacząćOdPozycji)
która wyszukuje Ci pierwsze wystąpienie separatora, począwszy od ZacząćOdPozycji - wstawiasz 1, a potem systematycznie przesuwasz w pętli, po każdym znalezieniu.

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