Sortowanie adresów www - jak?

0

Witam
Mam taki kod w memo:

http://www.strona1.com/wartoscstala/wartosczmienna/**jakisplik.rar**
http://www.strona1.com/wartoscstala/wartosczmienna2/**jakisdrugiplik2.rar**
http://www.strona1.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**

http://www.strona2.com/wartoscstala/wartosczmienna/**jakisplik.rar**
http://www.strona2.com/wartoscstala/wartosczmienna2/**jakisdrugiplik2.rar**
http://www.strona2.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**

http://www.strona3.com/wartoscstala/wartosczmienna/**jakisplik.rar**
http://www.strona3.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**

(celowo usunąłem w jakisdrugiplik2.rar - bo chcę sprawdzić jak program sobie poradzi bez tego). Chcę w memo2 uzyskać taki wynik:

http://www.strona1.com/wartoscstala/wartosczmienna/**jakisplik.rar**
http://www.strona2.com/wartoscstala/wartosczmienna/**jakisplik.rar**
http://www.strona3.com/wartoscstala/wartosczmienna/**jakisplik.rar**

http://www.strona1.com/wartoscstala/wartosczmienna2/**jakisdrugiplik2.rar**
http://www.strona2.com/wartoscstala/wartosczmienna2/**jakisdrugiplik2.rar**

http://www.strona1.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**
http://www.strona2.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**
http://www.strona3.com/wartoscstala/wartosczmienna3/**trzecipliczek.avi**

Czyli program ma mi sortować wg ostatniej wartości. Z tym, że gdyby cały adres miał ustaloną długość znaków to nie byłoby to problemem. Problem w tym, że wartosczmienna,strona1 i jakisplik.rar jest zmienna (mają różne długości).
Jak to posortować?

0

Dwie procedury: Copy i Pos są w stanie podzielić string.
Jeśli umiesz programować to umiesz również to zrobić.

A pytanie chyba przenieść do Newbie należy.

0
uses StrUtils
var

Text : String;
Position : Integer;
Last : Integer;
Cutted : String;
begin
Text := 'www.strona.com/asdsadasd/asdsad/asdasdasd/asdasd/345345.txt';
Position := 1;
repeat
Last := PosEx('/',Text,Position);
Position := Last+1;
until PosEx('/',Text,Position)=0;
Cutted := Copy(Text,Last+1,Length(Text));
ShowMessage(Cutted);
end;

Napisane na szybcika, ale działa sprawnie, do zmiennej Text podajesz ten twój link, a w zmiennej Cutted otrzymujesz końcówkę tego linka.

Pozdrawiam.

0

Napisałem to na szybko, bo byłem ciekaw w czym tutaj może być problem poza chyba lenistwem pytającego. Do poważniejszych porównań i różnic w tych zmiennych po "/" potrzebne bedą raczej wyrażenia regularne (jakby co polecam moduł z: http://regexpstudio.com - są przykłady oraz dokumentacja), ale dla tego przykładu wystarczy raczej poniższy kod. Powinieneś zrozumieć ideę. A temat oczywiście przenoszę do Newbie.

function Sortowanko(SL : TstringList; Index1, Index2 : integer) : integer;
const
  Prefix = 'http://';
var
  I : integer;
  S1, S2 : string;
begin
  S1 := SL[Index1];
  S2 := SL[Index2];
  if (Pos(Prefix, S1) > 0) and (Pos(Prefix, S2) > 0) then
  begin
    Delete(S1, 1, Length(Prefix));
    Delete(S2, 1, Length(Prefix));
  end;
  for I := 1 to 2 do
  begin
    S1 := Copy(S1, Pos('/', S1) + 1, MaxInt);
    S2 := Copy(S2, Pos('/', S2) + 1, MaxInt);
  end;
  Result := AnsiCompareText(S1, S2);
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  SL : TStringList;
begin
  SL := TStringList.Create;
  SL.Text := TwojeMemo.Text;
  sL.CustomSort(@Sortowanko);
  TwojeMemo.Text := SL.Text;
  SL.Free;
end;
0

Największe podziękowania należą się dla Olesio - dzięki! Ale dziękuję również Golden_Mind za kod. Kod [przez Olesia teoretycznie działa. Teoretycznie, bo dla podanych przeze mnie na początku wartości dostaję wynik:

http://www.strona3.com/wartoscstala/wartosczmienna/jakisplik.rar
http://www.strona2.com/wartoscstala/wartosczmienna/jakisplik.rar
http://www.strona1.com/wartoscstala/wartosczmienna/jakisplik.rar
http://www.strona1.com/wartoscstala/wartosczmienna2/jakisdrugiplik2.rar
http://www.strona2.com/wartoscstala/wartosczmienna2/jakisdrugiplik2.rar
http://www.strona3.com/wartoscstala/wartosczmienna3/trzecipliczek.avi
http://www.strona1.com/wartoscstala/wartosczmienna3/trzecipliczek.avi
http://www.strona2.com/wartoscstala/wartosczmienna3/trzecipliczek.avi

I niby ok - z pustymi liniami sobie poradzę. Jednak nie wiem czemu najpierw program daje strona3, później strona2, później strona1, później w drugim i trzecim przykładzie jest już dobrze :).

No i kod by działał, ale do momentu, aż zmienię wartości zmiennych. Przykładowy kod:

http://www.strona1.com/wartoscstala/zmienna2/jakisplik.rar
http://www.strona1.com/wartoscstala/zmienna333/jakisdrugiplik2.rar
http://www.strona1.com/wartoscstala/zmie444/trzecipliczek.avi

http://www.strona2.com/wartoscstala/zm5/jakisplik.rar
http://www.strona2.com/wartoscstala/zmienn6/jakisdrugiplik2.rar
http://www.strona2.com/wartoscstala/zmienn8/trzecipliczek.avi

http://www.strona3.com/wartoscstala/zmienna9/jakisplik.rar
http://www.strona3.com/wartoscstala/zmiennaaa10/trzecipliczek.avi

Daje mi wynik:

http://www.strona2.com/wartoscstala/zm5/jakisplik.rar
http://www.strona1.com/wartoscstala/zmie444/trzecipliczek.avi
http://www.strona2.com/wartoscstala/zmienn6/jakisdrugiplik2.rar
http://www.strona2.com/wartoscstala/zmienn8/trzecipliczek.avi
http://www.strona1.com/wartoscstala/zmienna2/jakisplik.rar
http://www.strona1.com/wartoscstala/zmienna333/jakisdrugiplik2.rar
http://www.strona3.com/wartoscstala/zmienna9/jakisplik.rar
http://www.strona3.com/wartoscstala/zmiennaaa10/trzecipliczek.avi

Co niestety jest wynikiem błędnym (w ogóle program nie sortuje tak jak powinien). Dlaczego się tak dzieje?
W załączniku przesyłam cały projekt wraz z exe (pisany w Delphi 2010).

0

Ech, Ty na prawdę jesteś leniwy. Fajnie, że dziękujesz, ale dostając gotowca powinieneś go też potraktować jako naprowadzenie. Wiadomo, że brany pod uwagę jest cały pozostały ciąg znaków z adresu po drugim "/", a więc w przypadku gdy ciągi są takie same funkcja działa jak jej każe kod, a ten tego nie przewidywał. Czy tak ciężko ruszyć swoją tylną część ciała i spojrzeć do helpa albo w google jak działa funkcja CustomSort lub też AnsiCompareText i poprawić kod? Jeżeli znowu coś będzie nie po Twojej myśli to zastanów się co poprawić i zmodyfikuj to już samodzielnie. Forum jest głownie po to aby naprowadzić, a nie pisać cały program z kogoś.

function Sortowanko(SL : TstringList; Index1, Index2 : integer) : integer;
const
  Prefix = 'http://';
var
  I : integer;
  S1, S2 : string;
begin
  S1 := SL[Index1];
  S2 := SL[Index2];
  if (Pos(Prefix, S1) > 0) and (Pos(Prefix, S2) > 0) then
  begin
    Delete(S1, 1, Length(Prefix));
    Delete(S2, 1, Length(Prefix));
  end;
  for I := 1 to 2 do
  begin
    S1 := Copy(S1, Pos('/', S1) + 1, MaxInt);
    S2 := Copy(S2, Pos('/', S2) + 1, MaxInt);
  end;
  if S1 = S2 then
  begin
    Result := 0;
  end
  else
  begin
    Result := AnsiCompareText(S1, S2);
  end;
end;

Poza tym jeżeli nazwy plików po ostatnim "/" będą różne to znowu nie będziesz miał pewnie zadowalających Ciebie rezultatów. Wtedy już żeby nie mnożyć Pos'ow i pozostałych operacji na stringach, proponuje skorzystać z modułu do wyrażeń regularnych. Adres podałem. Wtedy sobie wyextractujesz co potrzeba z adresu w łątwy sposób i dopasujesz do tego sortowanie, ale to już zrób sam. Na google można znaleźć mnóstwo stron z przykładami użycia wyrażeń regularnych, przede wszystkim ogólnych przykładów.

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