[ Sole_boy @ 30.01.2003. 13:02 ] @
Pozdrav ljudi, ima li neko ideju kako mogu da uradim parser koji bi neki txt fajl sa podacima tipa sima,mika,pera,djoka ubacio u bazu podataka ali u odredjena polja, znaci sima u polje klosari mika u polje alkosi itd... ???
[ Igor S @ 30.01.2003. 15:19 ] @
samo beta verziju (bez source-a) ... ako odgovara :)
pa valjda ces naci i ideje ... mail me
[ Riste Pejov @ 31.01.2003. 01:33 ] @
Mozes da malo vise das informacija o formatu u kome su zapisani
podaci u txt fajlu.
[ Sole_boy @ 31.01.2003. 14:39 ] @
Pa recimo imam bazu tipa: (PARADOX)

IME | PREZIME | TELEFON

i npr. u TXT fajlu imam

PERA | SIMIC | 333555
RASA | RASIC | 555666

...

i sada parser bi trebao da ovo ubaci u bazu podataka
tim redom i u odrdjeno polje!
[ goblin @ 31.01.2003. 19:34 ] @
ja ovakve probleme resavam na silu: koristim temporary string u koji ubacim jednu liniju iz fajla, pa onda samo iskopiram odredjeni broj karaktera, pa zatim izbrisem onoliko koliko sam i iskopirao. Taj delimican string koji je iskopiran mozes dalje da putem Trim funkcije uredis (izbrises beline), pa ponovis postupak za drugi, treci element u redu itd.

Posle samo uzmes sledeci red i tako dok ne naidjes na eof.

Ovo radi samo ako ti elementi u redu zauzimaju isti broj mesta. Toplo ti preporucujem da ako ovo nije slucaj bolje preuredis txt fajl nego da komplikujes parser jer se lako moze desiti da pogresis; doduse, koriscenjem nekog nekarakteristicnog karaktera za razdvajanje elemenata nece mnogo iskomplikovati parser - tada samo koristis Pos('|', trenutni_red) funkciju da odredis do kog elementa da kopiras/brises trenutni red.

Ako treba source code, vichi
[ Sole_boy @ 31.01.2003. 21:39 ] @
Pa ako ti nije problem da okacis!
[ Riste Pejov @ 01.02.2003. 22:51 ] @
Code:

var
my_list:TStringList;
i:int;
begin
my_list:=TStringList.Create; // ne secam dali je bas ovako, odavno nisam radio u delphi
my_list.LoadFromFile('c:\moj_delimited_fajl.txt');

for k:=0 to my_list.Count-1 do
  begin
  //insertuj novi slog u dataset 
  my_dataset.insert;
  //counter za broj kolone pocinje sa nulom
  p:=0;
  while(Length(my_list[k])>0) do
      begin
    
         
   if(Pos(my_list[k],'|')>0)
   begin
// kopiraj slova koja su ispred prvog znaka | i zadatu kolonu dataseta
   my_dataset.Params.Params[p].AsString:=Copy(my_list[k],1,Pos(my_list[k],'|')-1);   
// postojeci string dobija vrednost istog, bez slova ispred prve instance | 
   my_list[k]:=Copy(my_list[k],Pos(my_list[k],'|')+1,Length(my_list[k])-Pos(my_list[k],'|')-1) ;
   end
  else
   begin 
   //kad e radi o zadnjem podatku, onda nemamo | i kopiramo ostatak stringa
   my_dataset.Fields.Fields[p].AsString:=my_list[k];
   my_list[k]:='';
   end;
   // predji na sledecu kolonu   
   inc(p);
   end;
   my_dataset.post; //postuj podatke u tabelu
  end;

end;


Za da ovo radi, moras imati my_dataset, koji ce biti koji bilo objekat nasledjen iz TDataset-a, i imati isti broj kolona, kako sto ima fajl koji parsiras

princip je isti gore navedeni sa nekih malih izmena.
ukoliko ti nesto nije jasno, slobodno pitaj :)

[Ovu poruku je menjao Riste Pejov dana 03.02.2003. u 10:58 GMT]
[ Sole_boy @ 02.02.2003. 12:35 ] @
Hmm CODE radi ali kada se umesto my_dataset.params stavi my_dataset.Fields[p].asstring i samim tim sve podatke ubacuje u prvo polje???
[ Riste Pejov @ 03.02.2003. 08:57 ] @
i mislio sam na Fields, ali eto, iz neobjasnivih razloga (ceo dan sam sam radio na jednom ogromnom IB stored proceduru), sam umesto Fields, stavio Params, izvinite. Koregirano.