[Delphi5] Functie doorloopt maar een deel van de t

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ik ben momenteel bezig met een nummer-weergave programma, voor ISDN. Allemaal goed en wel, maar Delphi doorloopt de textfiles met daarin de database niet helemaal. Ik heb een textfile van 350mb (megabyte ja), die wordt helemaal doorlopen, en ook een van 5mb waarvan alleen steeds de eerste 38392 regels worden doorlopen.

Het gaat om de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function TForm1.StreetName(StreetId, TownId: String): String;
var StreetFile: TextFile;
    TempLine, Line: String;
    SearchHit: Boolean;
    i: LongInt;
begin
  AssignFile(StreetFile,'c:\cdfoon\street.txt');
  Reset(StreetFile);
  SearchHit:=False;
  Line:='No hits !';
  while not Eof(StreetFile) do
    begin
    ReadLn(StreetFile, TempLine);
    if (Pos(TownId, TempLine)>0) then
      begin
        Line:=TempLine;
        SearchHit:=True;
      end;
    if Eof(StreetFile) then
      SearchHit:=True;
    end;
  CloseFile(StreetFile);
  Result:=Line;
end;

Het bestand telt op de kop af 274045 regels. Het wordt netjes geopend en afgesloten, en het probleem is er ook als ik alleen maar dit stukje code uitvoer. Wat doe ik fout ??

Mother, will they like this song?


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Misschien niet echt een oplossing voor dit probleem, maar je kunt een textfile ook inlezen in een TStringList.
code:
1
TStringList.LoadFromFile()

en daar dan op zoeken...

https://fgheysels.github.io/


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Mhhkay ik heb nu dit
code:
1
2
3
  StreetStringList.LoadFromFile('c:\CDFOON\street.txt');
  i:=StreetStringList.IndexOf(StreetId+Chr(9)+TownId);
  Line:=StreetStringList.Strings[i];

maar die tweede regel geeft constant een access violation error, en ook als ik ipv IndexOf de function Find gebruik....

Mother, will they like this song?


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 00:05

Knutselsmurf

LED's make things better

Op vrijdag 05 juli 2002 19:19 schreef TheLunatic het volgende:
Mhhkay ik heb nu dit
code:
1
2
3
  StreetStringList.LoadFromFile('c:\CDFOON\street.txt');
  i:=StreetStringList.IndexOf(StreetId+Chr(9)+TownId);
  Line:=StreetStringList.Strings[i];

maar die tweede regel geeft constant een access violation error, en ook als ik ipv IndexOf de function Find gebruik....
Je zou even kunnen kijken of er een limiet zit aan het aantal items in een TStringlist. Omdat een TStringlist intern in Delphi een array is, kan ik mij heel goed voorstellen dat er een maximum van bijv. 32767 items is.

- This line is intentionally left blank -


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Kun je er niet een database van maken, en de zoek functies van die database gaan gebruiken. Eventueel icm een index ofzo?

Oja, wat ook wel makkelijk is: cache de adressen en nummers. Zovaak veranderen ze niet, en je komt ze vast wel vaker dan 1x tegen. Misschien een oplossing voor de snelheid van de zoek opdracht.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Zonde van je 5 mb om dat te gaan cachen, het doorzoeken vanaf harddisk is ook zo gebeurt en hoeft maar n paar keer per dag te gebeuren.

Database maken kan natuurlijk wel, maar dan ben je altijd gebonden daareen en als je het dan op een andere pc wilt installeren moet je ook weer delphi installerne (tenminste voor zover ik weet, ik heb op school paradox7 geleerd via database desktop bij delphi).

Mother, will they like this song?


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Ik werk voor mijn werk met Access (kleine projecten) en MSSQL (grote projecten). De projecten die ik daarvoor maak werken op alle machines. Dat hoeft opzich dus niet een probleem te vormen. Alleen weet ik niet of het sneller is als een tekst file doorzoeken. Het was maar een suggestie.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • sds
  • Registratie: Juni 2002
  • Laatst online: 28-08 19:06

sds

Heb je StreetStringList eigenlijk wel gecreeerd?
StreetStringList := TStringList.Create;? Lijkt me eerder dat daar die access violation vandaan komt...

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Maar het moet toch ook mogelijk zijn vanuit de textfile !?! Ik bedoel, met een 350mb textfile werkt het ook gewoon, dus waarom niet met een 5mb textfiletje :s


edit: en wat ik ook wel wil weten, als je IndexOf of Find gebruikt, moet je dan de complete string meegeven bij de parameters of mag het ook een deel van de string zijn ?

Mother, will they like this song?


  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op vrijdag 05 juli 2002 22:57 schreef TheLunatic het volgende:
Maar het moet toch ook mogelijk zijn vanuit de textfile !?! Ik bedoel, met een 350mb textfile werkt het ook gewoon, dus waarom niet met een 5mb textfiletje :s


edit: en wat ik ook wel wil weten, als je IndexOf of Find gebruikt, moet je dan de complete string meegeven bij de parameters of mag het ook een deel van de string zijn ?
Ik kan er niet echt bij dat je 350 meg sequencieel wil doorlopen.
Delphi components zoals Tstringlist zijn hier niet voor bedoeld.
Sorteer 't bestand, en dan kan je veel sneller de gegevens halen.
while not Eof(StreetFile) do
    begin
      ReadLn(StreetFile, TempLine);
      if (Pos(TownId, TempLine)>0) then
        begin
          Line:=TempLine;
          SearchHit:=True;
        end;
      if Eof(StreetFile) then
        SearchHit:=True;
    end;
Je doorloopt de hele file, ook al heb je gevonden wat je zocht :?
Database maken kan natuurlijk wel, maar dan ben je altijd gebonden daareen en als je het dan op een andere pc wilt installeren moet je ook weer delphi installerne (tenminste voor zover ik weet, ik heb op school paradox7 geleerd via database desktop bij delphi).
Kan ook zonder Database engines worden gedaan.

  • sds
  • Registratie: Juni 2002
  • Laatst online: 28-08 19:06

sds

Op vrijdag 05 juli 2002 22:57 schreef TheLunatic het volgende:
Maar het moet toch ook mogelijk zijn vanuit de textfile !?! Ik bedoel, met een 350mb textfile werkt het ook gewoon, dus waarom niet met een 5mb textfiletje :s
Inderdaad, vreemd probleem, waarschijnlijk een eof karakter ergens halverwege in het bestand (geen idee welke code dat is) Heb je al geprobeerd om tijdelijk wat regels uit het bestand te verwijderen waar hij stopt met lezen en dan kijken of het wel goed gaat?
edit: en wat ik ook wel wil weten, als je IndexOf of Find gebruikt, moet je dan de complete string meegeven bij de parameters of mag het ook een deel van de string zijn ?
IndexOf moet precies de string zijn, geloof zelfs case sensitive. Find weet ik niet, kijk eens in de help zou ik zeggen. Een beetje debuggen wil ook nog wel eens nuttig zijn :P Maar volgens mij is 350 MB in een stringlist inlezen niet erg gezond voor het geheugengebruik....

In het geval van je originele manier zou ik wel ff die while-loop afbreken als je die hit hebt gevonden, scheelt een hoop tijd als de eerste regel in het bestand al was wat je zocht.

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 21-08 11:09

Acid_Burn

uhuh

EoF = ^Z = Char(26) als ik me niet vergis

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Hey dat gebeuren van Charachter 26 kan wel eens kloppen ja! Ik kan die tekstfile namelijk ook nog laten bewerken door een programmatje van het internet (meegeleverd met de software die de tekstfile zelf genereerde), en die zegt dat er iets van 'not correctly terminated'. Dat zou daar dan welles aan kunnen liggen. Dalijk eens proberen om die Chr(26) eruit te krijgen...


En wat betreft Sponz
Ik kan er niet echt bij dat je 350 meg sequencieel wil doorlopen.
Delphi components zoals Tstringlist zijn hier niet voor bedoeld.
Sorteer 't bestand, en dan kan je veel sneller de gegevens halen.
Ik doorloop 'em ook niet totdat het einde van de file er is, maar totdat ik een SearchHit heb (da's dus die boolean). Alleen in het sutkje code hierzo heb ik dat ff veranderd...

Mother, will they like this song?


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Problem solved, er kwamen inderdaad eerder al tekens voor die zouden aangegeven dat de file afgelopen is...

Mother, will they like this song?


  • sds
  • Registratie: Juni 2002
  • Laatst online: 28-08 19:06

sds

mooi zo, op naar het volgende probleem ;)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op zondag 07 juli 2002 17:07 schreef TheLunatic het volgende:
Problem solved, er kwamen inderdaad eerder al tekens voor die zouden aangegeven dat de file afgelopen is...
Hay, zou je misschien even online willen komen op ICQ, ik had een vraagje.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ik gebruik ICQ niet meer, misschien is het handiger als jij mij even add op MSN:


the-lunatic@hetnet.nl



edit: Gelijk ff profile bijgewerkt, excuses voor het ongemak ;)

Mother, will they like this song?

Pagina: 1