27. februar 2002 - 09:25Der 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<<<
Der bliver investeret massivt i AI. Teknologien er mere tilgængelig end nogensinde, og ambitionerne er høje. Alligevel oplever mange virksomheder, at resultaterne udebliver.
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;
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
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;
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.
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]);
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.
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> 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)?
(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]);
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]);
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]);
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]);
Det er også derfor du har fået dinne point (du har vel fået dem?).
Synes godt om
Ny brugerNybegynder
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.