Podela stringa

Podela stringa

offline
  • Pridružio: 05 Maj 2005
  • Poruke: 84
  • Gde živiš: Cirikovac

Imam string proizvoljne duzine u kome je upisano nesto poput "0;111;222;333".Znaci,kod treba da ukloni ";" i da u TextBox kontroli ili promenjivoj upise samo 0 111 222 333.Hvala.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

nova_varijabla := StringReplace(stara_varijabla, ';', ' ', [rfReplaceAll]);
Treba da ti je StrUtils ubacen u Uses klauzulu.

btw. ovo ne bi moglo da se zove podelom stringa.
Podela bi bila kada bi svaki deo stringa razdvojen znakom ';' trebao da se prekopira u novu varijablu. To onda postaje pravi CSV parser.

Dopuna: 15 Feb 2006 10:08

Evo ti kod za jedan CSV parser koji ucitava tekst iz fajla i unosi ga u StrgingGrid tako da svaka celija sadrzi po jedan deo stringa (razdvojeni znakom ';'). Kod je malo komplikovan jer mora da brine i o dodavanju kolona i redova u StringGrid. StringGrid ima jedan fiksan red u koji se ne upisuju podaci iz CSV fajla. Ukoliko linija u CSV fajlu ne sadrzi znak ';', onda linija nece uopste biti parsovana jer nije validna.
procedure TfrmMain.Button1Click(Sender: TObject);     // Load CSV var   Col, Row, PosComma: integer;   sField: string;   sLine: string;   f: textfile;   col_count: integer; begin   if OpenDialog1.Execute then      begin        AssignFile(f, OpenDialog1.FileName);        Reset(f);        Row := 0;        col_count := 1;        StringGrid1.RowCount := 2; //ova i sledeca linija su potrebne da bi        StringGrid1.FixedRows := 1; //StringGrid prihvatio jedan fiksni red        repeat  // pocni citanje iz fajla;          readln (f, sLine); // ucitaj celu liniju;               PosComma := Pos(';', sLine); //prvo ispitaj da li linija poseduje znak ';'          if PosComma > 0 then //ukoliko poseduje, onda je obradjujemo          begin            Row := Row + 1;            StringGrid1.RowCount := Row +1;             Col := 0;             repeat               if Col = col_count then col_count := col +1;               StringGrid1.ColCount := Col_count;               PosComma := Pos(';', sLine);               if PosComma > 0 then                 sField := Copy(sLine, 1, PosComma - 1)               else                 sField := sLine;               StringGrid1.Cells[Col, Row] := sField;               if PosComma > 0 then begin                 Delete(sLine, 1, PosComma);                 Col := Col + 1;               end;             until PosComma = 0;           end;        until EOF(f);        CloseFile(f);     end; end;



offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

Evo objekta koji sam uradio za sve zive potrebe tog tipa

TStringTokenizer = class(TObject)   private     FDelimeter: Char;     FInputString: string;   public     constructor Create(s: string; Delim: Char); overload;     constructor Create; reintroduce; overload;     function GetLastToken: string;     function NextToken: string;     function Count: Integer;     property InputString: string read FInputString write FInputString;     property Delimeter: Char read FDelimeter write FDelimeter;   end; constructor TStringTokenizer.Create(s: string; Delim: Char); begin   FDelimeter := Delim;   FInputString := s; end; function TStringTokenizer.Count: Integer; var   s                      : string;   i, gde                 : Integer; begin   Result := 0;   s := FInputString;   if s = '' then     exit;   if pos(FDelimeter, s) = 0 then   begin     Result := 1;     exit;   end;   if s[1] = FDelimeter then     Delete(s, 1, 1);   if s[Length(s)] = FDelimeter then     s := copy(s, 1, Length(s) - 1);   i := 1;   while Pos(FDelimeter, s) <> 0 do   begin     gde := Pos(FDelimeter, s);     Delete(s, 1, gde);     inc(i);   end;   Result := i; end; constructor TStringTokenizer.Create; begin   inherited Create; end; function TStringTokenizer.NextToken: string; var   i                      : Integer; begin   i := pos(FDelimeter, FInputString);   if i < 1 then     i := Length(FInputString);   Result := Copy(FInputString, 1, i); //- 1);   if i > 0 then     Delete(FInputString, 1, i);   if Result <> '' then     if Result[Length(Result)] = FDelimeter then       Delete(Result, Length(Result), 1); end; function TStringTokenizer.GetLastToken: string; var   s                      : string;   gde                    : Integer; begin   s := FInputString;   if s[Length(s)] = FDelimeter then     s := copy(s, 1, Length(s) - 1);   while Pos(FDelimeter, s) <> 0 do   begin     gde := Pos(FDelimeter, s);     Delete(s, 1, gde);   end;   Result := s; end;

offline
  • Pridružio: 05 Maj 2005
  • Poruke: 84
  • Gde živiš: Cirikovac

Gospodo,mojom greskom je doslo do postavljanja dva pitanja sa identicnom sadrzinom.Od ponudjenih odgovora najvise mi odgovara resenje od Bobbya za Delphi.Puno pozdrava i da ste svi zivi i zdravi.

Ko je trenutno na forumu
 

Ukupno su 1421 korisnika na forumu :: 36 registrovanih, 6 sakrivenih i 1379 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Ageofloneliness, antonije64, Apok, Asparagus, Brana01, CikaKURE, comi_pfc, cuculo, Dorcolac, Dukelander, Georgius, gmlale, janbo, ladro, lord sir giga, Lošmi, Lucije Kvint, Magistar78, Mcdado, mercedesamg, Misirac, Mixelotti, mocnijogurt, naki011, Nemanja.M, Ripanjac, S2M, skvara, Srle993, Stanlio, stegonosa, Vlad000, Vlada1389, yrraf, zlaya011