Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko jedne procedure za pretragu ini-fajla...

[es] :: Pascal / Delphi / Kylix :: Pomoc oko jedne procedure za pretragu ini-fajla...

[ Pregleda: 2881 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
*.ptt.yu.



Profil

icon Pomoc oko jedne procedure za pretragu ini-fajla...23.11.2006. u 17:56 - pre 211 meseci
Krenuo sam da radim jedan programcic za koji sam mislio da ce biti dovoljan ini fajl i
da nece morati da se radi sa bazama, ali polako se "udebljao", tako da cu ga kad-
tad morati napraviti sa bazom, ali da ne duzim.... uradio sam sve sa ini fajlovima
jer nisam ocekivao velik broj podataka, a ceo program sa dosta mogucnosti je
velicine nekoliko stotina kilobajta sto mu je opet dobra strana...

Dakle. U ini fajl upisujem SEKCIJE koje su ustvari napravljeni string po
formuli koju cete provaliti iz same procedure. Zatim u tu sekciju
ubacujem neke varijable i njihove vrednosti. E sad da zanemarimo
upis u ini, meni ustvari treba da mi neko kaze da li je moguce napraviti
brzu proceduru za pretragu od ove koju sam ja sklepao po brute force
principu (vrte se svi datumi za period jedne godine, dve promenljive
su staticne, a dve se menjaju od 1 do 9, tako da se na kraju ukupno
dobije 30132 kombinacije. Mom celeronu na 2,67Ghz treba desetak
sekundi da to provrti sto mi je mnogo, a i mana moje procedure je da trajanje pretrage
ne zavisi od broja upisa u ini-ju vec uvek isto traje zbog nacina
pretrage. Ako neko ima neko elegantnije resenje, molim za predlog.
Gledao sam malo metode za rad sa ini fajlovima ali nisam medju
njima uspeo da nadjem nesto sto bi mi pomoglo da ovo brze odradim....
..mada mozda sam nesto prevideo.


CODE:

// -------------------
// -------------------

// Ako je kljuc Nastavni Predmet (indeks 3):

If KeyListBox.ItemIndex = 3 Then

begin

If NPEdit.Text = '' Then
begin
ShowMessage('Niste uneli KLJUČ po kome treba raditi pretragu!');
Exit;
end;

begin
GlavnaForma.Image4.Visible:= True;
GlavnaForma.Image4.Repaint;

// Sada ide pretrazivanje INI-ja po kljucu Nastavni Predmet...

indeks:= 0;
Dan:= 1;
Mesec:= 1;
Godina:= GlavnaForma.PeriodZaPretragu;

ProgressBar1.Min:= 0;
ProgressBar1.Max:= 30132; // broj kombinacija za 1 god
ProgressBar1.Step:= 1;

REPEAT
Repeat
repeat
NapravljenDatum:= IntToStr(Dan) + '.' +
IntToStr(Mesec) + '.' + IntToStr(Godina);

For o:= 1 to 9 do
begin
For c:= 1 to 9 do
begin
If ProgressBar1.Position > 30130 then Image4.Visible:= False;
NapravljenaSekcija:= NapravljenDatum + '_' +
GlavnaForma.ID_IniUst + '_' +
GlavnaForma.ID_IniRaz + '_' + IntToStr(o) + '_' +
IntToStr(c); // ovde vidite da se samo zadnje dve menjaju kod pravljenja stringa.
ProgressBar1.StepIt;
If ini.SectionExists(NapravljenaSekcija) Then
BEGIN
If AnsiContainsStr ((ini.ReadString(NapravljenaSekcija,
'PREDMET','')), NPEdit.Text) Then // proveravam da li za tu sekciju ima ono sto je uneto u pretrazivac Edit.
begin
RezListBox.Items.Insert(indeks, NapravljenaSekcija); // insertujem rezultate u drugi list box
Indeks:= Indeks + 1;
end;
END;
end;
end;

Dan:= Dan + 1;
until Dan = 32; // ne obracajte paznju na broj dana u mesecu :))
Dan:= 1;
Mesec:= Mesec + 1;
Until Mesec = 13; // ... niti na broj meseci u godini :)))
Mesec:= 1;
Godina:= Godina + 1;
UNTIL Godina = GlavnaForma.PeriodZaPretragu + 1; // ovo je jasno ko dan.


Indeks:= 0;
ProgressBar1.Position:= 0;
ShowMEssage('P r e t r a g a g o t o v a !');
ini.Free;
ProgressBar1.Visible:= False;
Exit;
end;

end;

// -------------------
// -------------------

Molim Vas, ima li ko brze resenje??

(samo mi ne spominjite fortrane i c++- eve i masince i tako te svemirce)

HVALA.
IN VINO VOMITUS
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 252
85.222.164.*



+1 Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...23.11.2006. u 22:47 - pre 211 meseci
Citat:
...Mom celeronu na 2,67Ghz treba desetak sekundi da to provrti sto mi je mnogo...

Mozda Celeron na 3 GHz?
Mozes li poslati primer ini fajla, sta korisnik unese a sta treba da dobije?
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
*.ptt.yu.



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 00:56 - pre 211 meseci
sekcija u ini fajlu je recimo

'22.9.2006_1_4_3_2'

sto znaci da je datuma 22.09.2006. godine u ustanovi sa ID brojem 1, u cetvrtom
razredu, trecem odeljenju i drugi cas.... odrzan cas a varijable u okviru te skcije su recimo
NastavnaJedinica=neki string
NastavniPredmet=neki string
MestoOdrzavanjaCasa=neki string.... // i tako dalje, ima dosta nekih varijabli.

Dakle, sve sekcije u iniju tako izgledaju.
Ja sa svojom pretragom treba da obezbedim da se korisniku pronadje
cas po nekom kriterijumu, iz primera procedure se vidi sta mi treba ako si pogledao.
Ja ne znam da li je pretragu moguce uraditi brze a da se ne pregledaju
svi datumi za jednu godinu (koju korisnik odredi, recimo 2005/2006)
a to ti je ono - PeriodZaPretragu.
Dakle kako da pronadjem nesto brze u iniju ako mi je poznata varijabla
string napravljen po sistemu koji se vidi iz procedure (varijabla NapravljenaSekcija)
Ono sto je sigurno je da taj string mora biti tako napravljen kako bi se
obuhvatili svi datumi....

nadam se da si me razumeo, pozdrav i hvala.


IN VINO VOMITUS
 
Odgovor na temu

badam

Član broj: 78553
Poruke: 97
62.108.111.*



+2 Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 03:31 - pre 211 meseci
ono kad-tad bolje da bude sto pre. vrlo brzo ces preci ogranicenje ini fajla (mislim da je 64kB, ispravite me ako gresim). za prvu ruku ovo bi trebalo da bude brze:

Code:

procedure TForm1.pretraga(kljuc,godina1,godina2:integer; ID_IniUst,ID_IniRaz:string);
var inif:TIniFile;
    Lista:TStringList;
    i,j,Godina:integer;
    a,b:string;
begin
  Lista:=TStringList.Create;
  try
    Lista.LoadFromFile('pathdoinifilea');
    inif:=TIniFile.Create('pathdoinifilea');
    Lista.Sort;
    i:=0;
    repeat
      i:=i+1
    until Lista[i][1]='[';
    while Lista[i][1]='[' do
    begin
      a:=Lista[i];
      b:=a;
      j:=pos('_',Lista[i]);
      Delete(a,j,length(a));  
      a:=RightStr(a,4);
      for Godina=Godina1 to Godina2 do
        if (a = IntToStr(Godina)) and 
           (copy(b,j+1,3) = ID_IniUst + '_' +ID_IniRaz)  then   //***ovo nisam siguran da je tacno ono sto ti treba
        begin
          c:=Copy(Lista[i],2,length(Lista[i])-2);
          If (inif.ReadString(c, KeyListBox.Items[kljuc] ,'') = NPEdit.Text) then  //***********??????????***********
            RezListBox.Items.Append(c)
        end;
      i:=i+1
    end;
  finaly
    inif.Free;
    Lista.Free
  end
end;


u redu sa **??** se podrazumeva da su u KeyListBox-u stringovi koji se podudaraju sa nazivima u ini fajlu. ako nije slucaj, otvori ini sa notepadom i uradi replaceall.

procedura se poziva sa:
Code:

  pretraga(KeyListBox.ItemIndex,GlavnaForma.PeriodZaPretragu,GlavnaForma.PeriodZaPretragu,GlavnaForma.ID_IniUst,GlavnaForma.ID_IniRaz)

stavio sam 2 godine za slucaj da pozelis da imas pretragu za vise godina. inace, ono nije jasno ko dan. pojednostavljeno, izgleda ovako:
Code:

godina=x;
repeat
  ...
  godina=godina+1
until godina=x+1  //uvek se izvrsi samo jednom. cemu repeat..until?


napravio sam ini sa rnd vrednostima velicine oko 50kB i probao oba nacina - razlika u brzini je ogromna. ProgressBar ti ne treba.
javi ako je negde zapelo. javi i ako nije.

Pozdrav

edit: ne mogu da verujem da sam se potrudio da udjem u problematiku. besposlen pop i prasice krstio. sledeci put stavi kod u [code] ovako je jako necitljiv
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
213.137.127.*



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 12:40 - pre 211 meseci
ej covece fala ti do neba ne mogu ni ja da verujem da si se OVOLIKO udubio u problematiku,
upravu si za ono sa godinom, prevideo sam.
Progres bar cu da ostavim, izgledace fensi kad samo "blesne" ako je ovo
toliko brzo ko sto kazes, probacu..

64kb? u bre.... pa ne znam...
napravicu da kad bude fajl 60 kb da se napravi sledeci ini.....

ah, na sta sam sve spreman da zaobidjem baze :)))

Hvala puno jos jedared :)
IN VINO VOMITUS
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
*.ptt.yu.



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 15:37 - pre 211 meseci
PS: Da, podudaraju se ime sekcija i stringovi u list-boxu, to je OK....

Nego mislim da cu sad da se samoubijem....


TCustomIniFile.ReadSections Method
Reads the names of all sections in an ini file into a string list.
Class
TCustomIniFile
Syntax
[Delphi] procedure ReadSections(Strings: TStrings); abstract; overload; virtual;
[Delphi] procedure ReadSections(const Section: string; Strings: TStrings); overload; virtual;
Description

AAAA!! >>> Call ReadSections to retrieve the names of all sections in an ini file into a string list.

Strings specifies the string object to hold the retrieved names. Strings can point to a TStrings descendant, or to a component property, such as Items for a TListBox component.

Ne mogu da verujem da sam prevideo ovo, verovatno sam video samo
metod ReadSection, a ne ReadSections.... ubicu se.

Nego, kako da iscitam velicinu ini fajla? Jel to nesto preko API-ja?

Treba mi jos samo ova informacija i obecavam da vise necu gnjaviti sa ovim INI-jima! :(

Osecam da je samo jedna komanda, ako neko zna, molim da mi stavi komandu i eventualno
ako nesto ide u Uses, tipa ShellApi-ja or something. Definitiveno nece biti dovoljno 64kb....

Hvala puno!
IN VINO VOMITUS
 
Odgovor na temu

badam

Član broj: 78553
Poruke: 97
62.108.111.*



+2 Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 15:56 - pre 211 meseci
TFileStream ima property Size
Code:

  xx:=TFileStream.Create('c:\brisi\aa.ini',fmOpenRead);
  velicina:=xx.Size
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
*.ptt.yu.



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...24.11.2006. u 17:00 - pre 211 meseci
Moram priznati da si me lepo prepao sa onih 64kb!
Sad sam upravo nafilovao ini sa oko 500kb, mrzelo me da cekam jos duze i probao sam
da citam iz njega, radi...
...nesto nisam siguran ali mozda je cak 4MB ogranicenje,
sad radim u Turbo-Delphiju pa nesto nisam nasao to (Help je bolji
u Delphiju), ako nadjem, javljam za ostale.....

Hvala ti jos jednom za proceduru, cenim trud, a meni sada samo ostaje
da je uskladim sa svojim programom. Odlicno je ovo sto si ostavio
mogucnost za duzi period jer sam ja stavio samo jednu godinu iz
razloga sto me muka uvatila kad sam video koliko traje pretraga za 5 god
ili ne daj boze nesto duze.

Thanks a lot. (ako je stvarno 4mb, to bi bilo kvaj inaf za ovo sto radim)

IN VINO VOMITUS
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
213.137.127.*



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...03.12.2006. u 21:52 - pre 210 meseci
8,5 MB, idemo dalje.... :)

Upisao sam nekih 10.000 sekcija sa 12 varijabli u okviru svake (veeelikih stringova).....

ali jos nisam nasao koliko je zaista ogranicanje :)
IN VINO VOMITUS
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 252
85.222.164.*



+1 Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...03.12.2006. u 22:12 - pre 210 meseci
ogranicenje je 4 GB... ako je disk FAT32. a onda predji na NTFS pa si slobodan :)
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
213.137.127.*



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 11:52 - pre 210 meseci
ko jos ista danas formatira na FAT-32?! :)

E, ali da vidis koliko mu treba da upise 10.000 uzastopnih sekcija....
nije uopste malo.... no nocas ce komp dobiti posao da
upise 100.000 sekcija (to bi trebalo da ispadne oko 85 MB mislim)

.... strasno zasta trosim struju :)
IN VINO VOMITUS
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
213.137.127.*



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 11:57 - pre 210 meseci
E, da ali sam naisao na jedno ogranicenje...

Kada sam pokusao da ucitam u jedan list-box sekcije, ucitao je samo 1400 i nesto...

(Zasto to? )

ako idem ovako: ini.ReadSections(ListBox1.Items) ;

Ako zelim ipak svih 10.000 sekacija da ucitam u list box, morao sam
ovako da uradim..

for i:=1 to 10000 do
a:=Ini.ReadString( blabla(i)..... i tako dalje....
ListBox1.Items.Add(a)...

Ovako sam uspao da 10000 sekcija ucitam u jedan list box,
doduse mozes cigaru da ispalis dok se ne ucita.
IN VINO VOMITUS
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 12:00 - pre 210 meseci
Pozdrav,

@Srdjan_exe

stvarno ti se divim koliko volje i strplenja imaš da akaš po tim ini fajlovima. Pre ili kasnije, moraćeš preći na neku "malu" bazu, npr. SQLite, Firebird Embedded, etc.
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
213.137.127.*



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 12:02 - pre 210 meseci
lepo znas kako, nego znas li odgovor zasto ono ogranicenje?
IN VINO VOMITUS
 
Odgovor na temu

nikola.j
Nikola Janković

Član broj: 15712
Poruke: 85
*.com
Via: [es] mailing liste



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 12:36 - pre 210 meseci
>

Ako ustanovis da ti je to sve sporo:

"FastStrings FREE:
A useful set of assembly optimised string manipulation routines. The most
remarkable of these is without a doubt the FastReplace function. StringReplace
took over 8 hours to complete multiple replacements on a 10mb string, whereas
FastReplace took 0.5 seconds (yes, half of a second). "

ako ti je i to sporo:

"NOTE
Make sure you check out the Delphi FastCode project, it has a faster
StringReplace routine and also some fast Pos routines too."


www.droopyeyes.com , pa sam resi upis citanje i parsovanje, umesto inifiles-a
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.dynamic.sbb.co.yu.



+1 Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 15:07 - pre 210 meseci
Citat:
Srdjan_exe: ko jos ista danas formatira na FAT-32?! :)


Formatiramo flash kartice za digitalce :)
 
Odgovor na temu

Srdjan_exe
Srdjan Pavlovic

Član broj: 117082
Poruke: 60
*.ptt.yu.



Profil

icon Re: Pomoc oko jedne procedure za pretragu ini-fajla...04.12.2006. u 21:22 - pre 210 meseci
e, nikola, samo jos jedno 4-5 dana i naucio sam asembler... :))

Ma definitivno se uce baze, ovo sa gigantskim ini fajlovima je
bilo zezanje cisto naravno...
SQLite najverovatnije...

morlic : cek samo dok Vista bude obavezna i na digitalcima... :)
IN VINO VOMITUS
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pomoc oko jedne procedure za pretragu ini-fajla...

[ Pregleda: 2881 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.