Avatar billede athlon-pascal Juniormester
27. februar 2002 - 09:25 Der er 36 kommentarer og
1 løsning

Søge i fil (ikke teksteditor)

Hvordan søger man, via en TEdit, i en fil på harddisken som følgende
------------------ filstart ------------------
jubii#søgemaskine
jubiii eda#ikke søgemaskine
yahoo#søgemaskine
yahooo eda#ikke søgemaskine
------------------ filslut ------------------
den skal kun søge før # i hver linje, hvis den finder det man søger skal den placere HELE linjen i en TListBox, hvis man i eksempelfilen søger efter f.eks. jubii skal den indsætte begge linjer hvor der står noget med jubii i TListBoxen.
Det er til et ordbogsprogram jeg vil prøve at lave.

Håber at der er nogen der vil have >>>200 POINT<<<
Avatar billede athlon-pascal Juniormester
27. februar 2002 - 09:26 #1
Kører med Delphi 4 standard under win98
Avatar billede martinlind Nybegynder
27. februar 2002 - 09:31 #2
VAR
  F : TextFile;
  Strx : String;
begin
  AssignFile(F,C:\TestFile.txt);
  while not EOF(F) do
  begin
      ReadLn(F,Strx);
      if Pos(Strx,Edit1.Text) = 1 then ListBox1.Items.Add(Strx);
  end;
  CloseFile(F);
end;
Avatar billede athlon-pascal Juniormester
27. februar 2002 - 09:33 #3
Hvor er #?
Den skal kun søge på hver linje FØR #!
Avatar billede martinlind Nybegynder
27. februar 2002 - 09:44 #4
VAR
  F : TextFile;
  Strx : String;
begin
  AssignFile(F,C:\TestFile.txt);
  Reset(F);
  while not EOF(F) do
  begin
      ReadLn(F,Strx);
      if Pos(Strx,Edit1.Text) = 1 then ListBox1.Items.Add(Strx);
  end;
  CloseFile(F);
end;

Dette eks. søger fra start på linen, men det kan jo udvides til at være mere avanceret

/Martin
Avatar billede cms Nybegynder
27. februar 2002 - 11:38 #5
var
  F : TextFile;
  S : String;
begin
  AssignFile(F, 'C:\TestFile.txt');
  Reset(F);
  while not EOF(F) do
  begin
    ReadLn(F, S);
    if (Pos(S, Edit1.Text) = 1) and (Pos(S, '#')=Length(Edit.Text)+1) then
      ListBox1.Items.Add(S);
  end;
  CloseFile(F);
end;
Avatar billede athlon-pascal Juniormester
27. februar 2002 - 11:51 #6
Hvis man søger efter Jub skal den finde både jubii#søgemaskine og jubiii eda#ikke søgemaskine.
Hvis man søger efter Yah skal den finde yahoo#søgemaskine og yahooo eda#ikke søgemaskine.
Avatar billede martinlind Nybegynder
27. februar 2002 - 11:55 #7
Det er da vist også sådan mit eks. funker
Avatar billede athlon-pascal Juniormester
27. februar 2002 - 13:08 #8
Har ikke Delphi ved hånden, tester hurtigst muligt
Avatar billede Marting Forsker
27. februar 2002 - 13:44 #9
du må da kun bruge nogen af det???

Martin
Avatar billede stoney Nybegynder
27. februar 2002 - 19:52 #10
Det er testet og virker
edit2 er feltet hvor du indtaster det du vil søge efter

procedure TForm1.Button2Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
searchfor: string;
begin
searchfor := edit2.Text;
sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0 then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;

Stoney
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 12:34 #11
stoney> Kan det klare "alle" filstørelser?
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 12:40 #12
martinlind & cms> Det virker ikke.

stoney> Min Delphi-computer er ikke på nettet, tester hurtigst muligt.
Avatar billede martinlind Nybegynder
28. februar 2002 - 12:49 #13
Der var en lille fejl :

Pas-fil:
---------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('Slam.txt');
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR
  Cnt : Integer;
begin
  ListBox1.Clear;
  for Cnt := 0 to Memo1.Lines.Count-1 do
    if Pos(Edit1.Text,Memo1.Lines[Cnt]) = 1 then
    ListBox1.Items.Add(Memo1.Lines[Cnt]);
end;

end.
-------------
DFM-fil
-------------
object Form1: TForm1
  Left = 254
  Top = 109
  Width = 417
  Height = 292
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Edit1: TEdit
    Left = 35
    Top = 15
    Width = 121
    Height = 21
    TabOrder = 0
    Text = 'Edit1'
  end
  object ListBox1: TListBox
    Left = 35
    Top = 50
    Width = 121
    Height = 151
    ItemHeight = 13
    TabOrder = 1
  end
  object Memo1: TMemo
    Left = 205
    Top = 15
    Width = 181
    Height = 186
    Lines.Strings = (
      'Memo1')
    TabOrder = 2
  end
  object Button1: TButton
    Left = 165
    Top = 15
    Width = 26
    Height = 21
    Caption = '..'
    TabOrder = 3
    OnClick = Button1Click
  end
end
-------------------

Og dette virker !!!

Fejlen var at du skulle bytte om på parameterne i Pos(); strengen man søger efter skal stå først.

/Martin
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 12:51 #14
martinlind> Kan DET klare "alle" filstørelser? Det er til en ordbog!
Avatar billede martinlind Nybegynder
28. februar 2002 - 12:56 #15
Ja, jeg har læst en 1mb fil ind i en stringlist og det kører fint, det går endda meget stærk, meget hutigere en at læse den som en textfil
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 12:57 #16
Så prøver jeg det!
Avatar billede stoney Nybegynder
28. februar 2002 - 12:57 #17
Hvis du kører win9x er begrænsningen 32k.
Det er ikke Delphi men en begrænsning i windows.
I winnt og frem er begrænsning 2gb, men hvis du har så
store filer ville jeg nok vælge en database løsning, indexeret
på en eller anden funky måde. ( evt. Rubicon)

Stoney
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 20:51 #18
stoney> Det virker :)
Er det muligt at vælge at den skal søge fra starten af hver linje (søger man efter abe finder den abe og abekat, ikke tabe)? Og fra slutningen  (før #) (søger man efter abe finder den abe og tabe, ikke abekat)? Og præcist (søger man efter abe finder den abe og kun abe)?

martinlind> Det virker stadivæk ikke :(
Avatar billede Marting Forsker
28. februar 2002 - 20:57 #19
hej Stoney!

jeg har prøvet det af det du har lavet!!

den læser bagfra??? skal den det??

har du få min e-m lige før??

Martin
Avatar billede athlon-pascal Juniormester
28. februar 2002 - 21:14 #20
marting> Det der med bagfra løste jeg ved at ændre linjen
for i:= sl.Count-1 downto 0 do
til
for i:= 0 to sl.Count-1 do
Avatar billede Marting Forsker
28. februar 2002 - 21:18 #21
ok hvor kan i det fra???

i kan nogen treks her inde!!!!

Martin
Avatar billede stoney Nybegynder
01. marts 2002 - 03:56 #22
marting>> sl.count er antal linier
downto betyder den tæller ned til 0. (altså læser den bagfra)

athlon-pascal>>

Jeg kigger lige på det senere.
Jeg skal nok løse det for dig.
Klokken er mange !!

Stoney
Avatar billede athlon-pascal Juniormester
01. marts 2002 - 08:37 #23
stoney> ok!
Avatar billede athlon-pascal Juniormester
01. marts 2002 - 19:38 #24
stoney> Hvornår er senere (ca.)?
Avatar billede stoney Nybegynder
01. marts 2002 - 22:11 #25
Jeg kigger på det i aften/nat.

Jeg er lige kommet kommet hjem fra arbejde.

Stoney
Avatar billede stoney Nybegynder
02. marts 2002 - 13:40 #26
(søger man efter abe finder den abe og abekat, ikke tabe)?

procedure TForm1.Button6Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;

begin
nothing := '';

blank := ' ';
searchfor :=  edit1.Text ;

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);

if  ((chrbefore = '') or (chrbefore = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;
-----------------------------------------------------------
Og fra slutningen  (før #) (søger man efter abe finder den abe og tabe, ikke abekat)?

procedure TForm1.Button7Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;
txt : string;

begin

Txt := edit1.Text;
    begin

  for li:=Length(txt) downto 1  do
    searchfor := searchfor + txt[li];


        end;

nothing := '';

blank := ' ';

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);




if  ((chrafter = '') or (chrafter = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;
------------------------------------------------------------

Og præcist (søger man efter abe finder den abe og kun abe)?

procedure TForm1.Button3Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;

begin
nothing := '';

blank := ' ';
searchfor :=  edit1.Text ;

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);




if ((chrbefore = '') or (chrbefore = ' ')) and ((chrafter = '') or (chrafter = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;

-----------------------------------------------

Så er der ikke mere for den 25 øre *GG*

Stoney
Avatar billede stoney Nybegynder
04. marts 2002 - 09:54 #27
Hvorfor rykker du for svar, hvis det ikke haster ?

Stoney
Avatar billede Marting Forsker
04. marts 2002 - 09:59 #28
Hej Stoney!!

kan han ikke brug det du har lavet??

Martin
Avatar billede athlon-pascal Juniormester
04. marts 2002 - 10:06 #29
Jeg er ved at tjekke det!
Avatar billede Marting Forsker
04. marts 2002 - 10:15 #30
ok du har måske ikke kigge på før nu???

Martin
Avatar billede athlon-pascal Juniormester
04. marts 2002 - 13:13 #31
Er ikke på nettet hver dag!
Avatar billede Marting Forsker
04. marts 2002 - 13:37 #32
Athlon-pascal hvorfor skulle Stoney så haster???

Martin
Avatar billede athlon-pascal Juniormester
05. marts 2002 - 10:04 #33
Stoney> Det sidste virker ikke, men jeg har selv lavet noget der virker!
Du får dinne point for at svare på det oprindelige spørgsmål!
Avatar billede stoney Nybegynder
05. marts 2002 - 10:11 #34
Takker.

Hvad er det der ikke virker ?

Stoney
Avatar billede athlon-pascal Juniormester
05. marts 2002 - 13:19 #35
Det her virker ikke (men jeg har selv lavet noget der virker):

(søger man efter abe finder den abe og abekat, ikke tabe)?

procedure TForm1.Button6Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;

begin
nothing := '';

blank := ' ';
searchfor :=  edit1.Text ;

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);

if  ((chrbefore = '') or (chrbefore = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;
-----------------------------------------------------------
Og fra slutningen  (før #) (søger man efter abe finder den abe og tabe, ikke abekat)?

procedure TForm1.Button7Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;
txt : string;

begin

Txt := edit1.Text;
    begin

  for li:=Length(txt) downto 1  do
    searchfor := searchfor + txt[li];


        end;

nothing := '';

blank := ' ';

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);




if  ((chrafter = '') or (chrafter = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;
------------------------------------------------------------

Og præcist (søger man efter abe finder den abe og kun abe)?

procedure TForm1.Button3Click(Sender: TObject);
var
sl : TStringlist;
s : string;
i : integer;
li : integer;
searchfor,searchfor1,searchfor2,searchfor3: string;
blank : string;
nothing : string;
posbefore,posafter : integer;
chrbefore,chrafter : string;

begin
nothing := '';

blank := ' ';
searchfor :=  edit1.Text ;

sl := TStringlist.Create;
sl.LoadFromFile('D:\txt1\myfile.txt');
  for i:= sl.Count-1 downto 0 do
if pos('#',(sl[i]))>0  then
begin
s := copy((sl[i]),1,(pos('#',(sl[i]))));
posbefore := pos(searchfor,(sl[i]))-1;
posafter := pos(searchfor,(sl[i]))+length(searchfor);
chrbefore := copy(s,posbefore,1);
chrafter := copy(s,posafter,1);




if ((chrbefore = '') or (chrbefore = ' ')) and ((chrafter = '') or (chrafter = ' ')) then

if pos(searchfor,s)>0 then
listbox1.Items.Add(sl[i]);


end;
  end;

-----------------------------------------------
Avatar billede stoney Nybegynder
05. marts 2002 - 15:17 #36
Det svar var til de 3 ekstra spørgsmål.
Det har intet med det oprrindelige spørgsmål at gøre. Det svarede
jeg på tidligere.

Men hvis du selv har løst så okay.

Stoney
Avatar billede athlon-pascal Juniormester
06. marts 2002 - 09:18 #37
Det er også derfor du har fået dinne point (du har vel fået dem?).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester