Skocz do zawartości

[Delphi] Algorytm SPLIT


Pieter

Rekomendowane odpowiedzi

No więc mam algorytm split do rozdzielania stringu i wygląda on następująco:

 

function split(input:string;schar:char;s:integer):string;
    var
       i,n:integer;
       schop: string;
    begin
       n := 1;
       for i := 1 to length(input) do
       begin
         if (input[i] = schar) then
         begin
           inc(n);
           if n = s then
           split := schop
           else
           schop := '';
           end
         else
           schop := schop + input[i];
         end;
    end;

 

kiedy chce podzielić taki string robie tak:

 

 

text_przed = '10 43 "Its Cool"';
text_po = split(text_przed,' ',2);

 

to wtedy text_po zamiast stać się Its Cool staje się "Its ponieważ funkcja rozdziela tekst po każdym znaku spacji a pomiędzy Its a Cool jest spacja więc to też rozdziela. I z tąd moja proźba czy mógł by mi ktoś dopisać do tej funkcji coś żeby tekst pomiędzy znakami "" ze spacją liczyła jako jedeną część? Wiecie żeby zamiast rozdzielone zwróciła całe. PLZZ POMOCY!!!

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym zrobil cos takiego, chociaz nie mam pojecia czy to zadziala, bo bawilem sie delphim tylko przez tydzien :P

function split(input:string;schar:char;s:integer):string;
    var
       i,n,skip:integer;
       schop: string;
    begin
       n := 1;
       skip := 0;
       for i := 1 to length(input) do
       begin
         if (input[i] = schar && skip = 0) then
         begin
           inc(n);
           if n = s then
           split := schop
           else
           schop := '';
           end
         else
           begin
           if (input[i] = '"') then
             begin
             if (skip = 1) then
             skip := 0;
             else
             skip := 1;
             end
           schop := schop + input[i];
           end;
         end;
    end;

 

Zedytowalem to troche chociaz watpie czy to cos da :]

Odnośnik do komentarza
Udostępnij na innych stronach

Po poprawieniu błędów i tak nie działa :/ :boxed:

 

Napisałem na 4programmers net i zaraz otrzymałem taką odpowiedz:

function split(input:string;schar:char;s:integer):string;
    var
       i,n:integer;
       quote, //czy badany znak pochodzi z pomiedzy cudzyslowow
       is_quote, //czy aktualny znak to cudzyslow
       is_schar, //czy aktualny znak to schar i nie pochcodzi z pomiędzy cudzysłowow
       poprzedni_ok //czy poprzedni znak należy do wyrazu
       :bool;
    begin
       n := 1;
       quote := False;
       for i := 1 to length(input) do
       begin
         is_quote := input[i] = '"';
         is_schar := not quote and (input[i] = schar);
         if is_quote or is_schar then
         begin
           if quote or poprzedni_ok then
           begin
             inc(n);
             if n > s then Exit else Result := '';
           end;
           if is_quote then quote := not quote;
           poprzedni_ok := False;
         end else
         begin
           Result := Result + input[i];
           poprzedni_ok := True;
         end;
       end;
       if poprzedni_ok then inc(n); //zwiekszamy n jesli ostatni wyraz nie był policzony
       if n <= s then Result := ''; //gdy za malo wyrazów we frazie
    end;

 

I to się nazywa szybka pomoc...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...