الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

البحث عن كلمة في ملف

مغلق
بدأه mojo في 25 مايو 2007 · 16 رد · 1,590 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد كنت استعمل هذا الكود للبحث عن كلمة في ملفات , ولكن المشكلة اليوم هي ان البحث عن كلمات بالغة العربية لاتظهر يعنى البحث لايعطي اي نتيجة رغم انني استعملت بعض وحدات TntSysUtils ولكن بدون نتيجة فهل من مساعدة من فظلكم وشكرا :

هذا هو الكود :

function ScanFile(const filename: String; 
				 const forString: String; // حتى ولو إستعملت WideString فهذا لايعطي اية نتيجة  
				 caseSensitive: Boolean ): LongInt; 
{ returns position of string in file or -1, if not found } 
const 
BufferSize= $8001;  { 32K+1 bytes } 
var 
pBuf, pEnd, pScan, pPos : PWidechar; 
filesize: LongInt; 
bytesRemaining: LongInt; 
bytesToRead: Integer; 
F   : File; 
SearchFor: PWidechar; 
oldMode: Word; 
begin 
Result := -1;  { assume failure } 
if (Length( forString ) = 0) or (Length( filename ) = 0) then 
   Exit; 
SearchFor := nil; 
pBuf	  := nil; 

{ open file as binary, 1 byte recordsize } 
AssignFile( F, filename ); 
oldMode := FileMode; 
FileMode := 0;	{ read-only access } 
Reset( F, 1 ); 
FileMode := oldMode; 
try { allocate memory for buffer and pchar search string } 
   SearchFor := StrAllocW( Length( forString )+1 ); 
   StrPCopyW( SearchFor, forString ); 
  if not caseSensitive then  { convert to upper case } 

  Tnt_WideUpperCase(SearchFor ); // 
	// AnsiUpperCase( SearchFor ); 
   GetMem( pBuf, BufferSize ); 
   filesize := System.Filesize( F ); 
   bytesRemaining := filesize; 
   pPos := nil; 
   while bytesRemaining > 0 do 
   begin 
	 { calc how many bytes to read this round } 
	 if bytesRemaining >= BufferSize then 
	   bytesToRead := Pred( BufferSize ) 
	 else 
	   bytesToRead := bytesRemaining; 

	 { read a buffer full and zero-terminate the buffer } 
	 BlockRead(F, pBuf^, bytesToRead, bytesToRead); 
	 pEnd := @pBuf[ bytesToRead ]; 
	 pEnd^:= #0; 
	 { scan the buffer. Problem: buffer may contain #0 chars! So we 
	   treat it as a concatenation of zero-terminated strings. } 
	 pScan := pBuf; 
	 while pScan < pEnd do 
	 begin 
	  if not caseSensitive then { convert to upper case } 
		Tnt_WideUpperCase( pScan ); 
	   pPos := StrPosW( pScan, SearchFor );  { search for substring } 
	   if pPos <> nil then 
	   begin { Found it! } 
		 Result := FileSize - bytesRemaining + 
				   LongInt( pPos ) - LongInt( pBuf ); 
		 Break; 
	   end; 
	   pScan := StrEndW( pScan ); 
	   Inc( pScan ); 
	 end; 
	 if pPos <> nil then 
	   Break; 
	 bytesRemaining := bytesRemaining - bytesToRead; 
	 if bytesRemaining > 0 then 
	 begin 
	 { no luck in this buffers load. We need to handle the case of 
	   the search string spanning two chunks of file now. We simply 
	   go back a bit in the file and read from there, thus inspecting 
	   some characters twice 
	 } 
	   Seek( F, FilePos(F)-Length( forString )); 
	   bytesRemaining := bytesRemaining + Length( forString ); 
	 end; 
   end; { While } 
finally 
   CloseFile( F ); 
   If SearchFor <> nil then 
	 StrDisposeW( SearchFor ); 
   If pBuf <> nil then 
	 FreeMem( pBuf, BufferSize ); 
end; 
end; { ScanFile } 
procedure GetFileList( FileList: TStringList; inDir, Extension : String ); 
procedure ProcessSearchRec( aSearchRec : TSearchRecW ); 
var 
  sDate: String; 
begin 
   if ( aSearchRec.Attr and faDirectory ) <> 0 then 
   begin 
	 if ( aSearchRec.Name <> '.' ) and 
		( aSearchRec.Name <> '..' ) then 
	 begin 
	   GetFileList( FileList, Extension, InDir + '\' + aSearchRec.Name ); 
	 end; 
   end 
   else 
   begin 
	 sDate := DateTimeToStr(FileDateToDateTime(aSearchRec.Time)); 
	 FileList.Add(inDir + '\' + aSearchRec.Name); 

   end; 

end; 

var CurDir : String; 
aSearchRec : TSearchRecW; 
begin 
CurDir := inDir + '\*.' + Extension; 
if WideFindFirst( CurDir, faAnyFile, aSearchRec ) = 0 then 
begin 
   ProcessSearchRec( aSearchRec ); 
   while WideFindNext( aSearchRec ) = 0 do 
	 ProcessSearchRec( aSearchRec ); 
end; 
WideFindClose(aSearchRec); 

end; 



procedure TForm1.GetHTMLFileList(Directory, SearchString: WideString; 
  CaseSens: Boolean); 
var 
FL: TStringList; 
begin 
FL := TStringList.Create; 
FL.Sorted := True; 
GetFileList(FL, Directory, 'HTM*'); 
ProcessHTMLFIles(FL, SearchString, CaseSens); 
FL.Free; 
end; 


procedure TForm1.ProcessHTMLFiles(FileList: TStringList; 
  SearchString: WideString; CaseSens: Boolean); 
var 
i: Integer; 
begin 
for i := 0 to Pred(FileList.Count) do 
begin 
   if ScanFile(FileList.Strings, SearchString, CaseSens) > 0 then 
   begin 
	 // The result was found 
	 Memo1.Lines.Add(FileList.Strings); // هنا استعمل  TntMemo لإظهار إسم الملفات التي تحتوي على الكلمة المراد البحث عنها
   end; 
end; 
end;
#2

اخي حتى تسهل مساعدتك اكثر، هل ممكن ترفق مثال

اقصد Project

ليكون الامر اسرع من نسخ/لسق الكود المكتوب فوق

d4baa0.gif
#3

OK here it is ,

Search.zip

تم تعديل هذه المشاركة بواسطة mojo في 26 مايو 2007 في 14:26

#4

up

#5

اخي هناك مكون للاخ عروة ابحث عنه في المنتدى

#6

حسب ما فهمت انت تريد البحث عن كلمة في ملف نصي

وحسب ما فهمته من المرفق

اخذت مثال للبحث عم كلمة في الملفات النصية الموجودة في مجلد

ثم حاول ن تضيف له دعم Unicode باستخدام مكونات TNT

وهذا لم ينجح لان:

1- المثال الذي انطلقت منه لا يدعم Unicode

2-ليست كل الملفات النصية Unicode

d4baa0.gif
#7
اقتباس
وهذا لم ينجح لان:

1- المثال الذي انطلقت منه لا يدعم Unicode

2-ليست كل الملفات النصية Unicode

شكرا اخي العزيز

هل من مساعدة في ذلك

#8
seiffo كتب:
اخي هناك مكون للاخ عروة ابحث عنه في المنتدى

اخي العزيز عن اي مكون تتحدث هل هو الـ ArMan

#9
اقتباس
شكرا اخي العزيز

هل من مساعدة في ذلك

عليك أن تعرف بأي encoding هو النص (سواءً للعربية أو لغيرها) وبعد ذلك يمكن التعامل مع النص ..

مثلاً في aje.htm تم إستخدام windows-1256 ..

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#10

اخي Cipher هل إذا عرفنا الـ Encoding نقوم بالتحويل Conversion لكي تنجح العملية ام ماذا ؟

#11

هذا مثال للبحث ينجح مع العربية

ضع النص في memo

والكلمة في edit1

واضغط على speedbutton

سوف تظهر احداثيات الكلمة التي تبحث عنها في الجدول

حيث عدد الاسطر هو عدد تكرار الكلمة

والخانة الاولى من كل سطر هي السطر الموجودة فيه الكلمة

والخانة الثانية هي رقم اول حرف من الكلمة في السطر

fffffffffff.rar

#12

السلام عليكم

جرب هذة الطريقة :

procedure TForm1.Button1Click(Sender: TObject);
var
  FoundAt: LongInt;
  Words: string;
  i, StartPos, ToEnd: Integer;
begin
	Words := 'xxx';
	with RichEdit1 do
	begin
	  if SelLength <> 0 then
		StartPos := SelStart + SelLength
	  else
		StartPos := 0;
	  ToEnd := Length(Text) - StartPos;
	  FoundAt := FindText(Words, StartPos, ToEnd, [stWholeWord]);
	  if FoundAt <> -1 then
		ShowMessage('faound : ' + Words);
  end;
end;
#13

ياإخواني bachirk و source code مشكلتي هي البحث على كلمة في ملف وليس في نص امامي او على Richedit , و البحث ان يظهر حتى الكلمات العربية .

شكرا

#14

هل البحث في ملفات نصية .TXT

ام ملفات .HTML ؟ ام كلاهما

تم تعديل هذه المشاركة بواسطة B.M.AbdelAziZ في 29 مايو 2007 في 11:07

d4baa0.gif
#15

اخي عبد العزيز البحث يكون على ملفات *.htm , *.html

#16

طريقة البحث في HTML تختلف عن TXT

اثناء البحث عليك ان تتجاهل تعليمات HTML

التي تكون داخل <>

d4baa0.gif
#17
اقتباس
طريقة البحث في HTML تختلف عن TXT

اثناء البحث عليك ان تتجاهل تعليمات HTML

التي تكون داخل <>

اخي عبد العزيز هلا غيرت في الكود او ساعدتني بكود يمكن ان يقوم بالمطلوب من فظلك .

وشكرا

هذا الموضوع مغلق.

مواضيع مشابهة