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 794 korisnika na forumu :: 58 registrovanih, 6 sakrivenih i 730 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 20624 - dana 04 Apr 2026 04:18

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 100jan, 9k38, A3C, AMX72, Aristotle2002, Belac91, Bo96, bojan1234, Bosnjo, bpvl, cifra, dane007, dankisha, darionis, darkdruid72, Dekanovic, dijica, Dimitrije Paunovic, DJUNTA, Dovla 1980, DragoslavS, dukajov, Frunze, Georgius, jalos, Josef, komsija1, kovac9mm, kybonacci, laurusri, ljuba.b, M74AB3, maxim_von_burdengate, MB120mm, mercedesamg, milenko crazy north, Mićko, MK10, mm1811, mnn2, museum, neko iz mase, nelezele, niksa517, Parker, pceklic, rakivan, raso76, RD84, Ripanjac, rodoljub, Seeker, skok, Troja, Tvrtko I, VanZan, vidra1, W123