delphi4arab منتديات دلفي للعرب
مصفوفه لعمل Index لملف Text - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مصفوفه لعمل Index لملف Text (/showthread.php?tid=580)

الصفحات: 1 2


مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

[COLOR="Navy"]السلام عليكم ورحمة الله وبركاته

كيف أستطيع أن أعمل مصفوفه لمحتوى ملف تكست (ملف تكست محتوياته ثابته) بحيث تكون كل كلمه لها رقم إندكس خاص يها وغير متكرر

مثال: لو عندي جملة "how are you are you ok"

Array[0]= how
Array[1]= are
Array[2]= you
Array[4]= ok

بمعنى لا يمكن أن نكررare أو you في رقم إندكس جديد لأنهم قد عرفوا سابفا (مع العلم أن الملف كبير جدا ومحتواه لا يقل عن الأف الكلمات ولا يمكن تعريف كلمة كلمة )

جزاكم الله خيراً
[/COLOR]


مصفوفه لعمل Index لملف Text - hanipino - 16-02-2009

عملت تغير صغير فقط على الدالة ExtractStrings الموجودة فى الوحدة Classes

[صورة: sanstitreqg6.jpg]
-
PHP كود :
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar
                        
): Integer;
var
  
Head, Tail: PChar;
 
//-------------//
  
Indx:LongWord;
  
Strings: TStringList;
 
//-------------//
  
EOS, InQuote: Boolean;
  
QuoteChar: Char;
  
Item: string;
begin
  Strings
:=TStringList.Create; 
  
Result := 0; Indx:=0;
  if (
Content = nil) or (Content^=#0) or (Strings = nil) then Exit;
  
Tail := Content;
  
InQuote := False;
  
QuoteChar := #0;
  
Strings.BeginUpdate;
  try
    
repeat
      
while Tail^ in WhiteSpace + [#13, #10] do Tail := StrNextChar(Tail);
      
Head := Tail;
      while 
True do
      
begin
        
while (InQuote and not (Tail^ in [QuoteChar, #0])) or
          
not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do Tail := StrNextChar(Tail);
        
if Tail^ in ['''', '"'] then
        begin
          
if (QuoteChar <> #0) and (QuoteChar = Tail^) then
            
QuoteChar := #0
          
else if QuoteChar = #0 then
            
QuoteChar := Tail^;
          
InQuote := QuoteChar <> #0;
          
Tail := StrNextChar(Tail);
        
end else Break;
      
end;
      
EOS := Tail^ = #0;
      
if (Head <> Tail) and (Head^ <> #0)  then
      
begin
        
if (Strings <> nil) then
        begin
          SetString
(Item, Head, Tail - Head);
          if (
Strings.IndexOf(Item)< 0) then
           begin
            SetLength
(ArrStr,Indx+1);
            
Strings.Add(Item);
            
ArrStr[Indx]:=(Item);
            
Inc(Indx);
           
end;
        
end;
        
Inc(Result);
      
end;
      
Tail := StrNextChar(Tail);
    
until EOS;
  finally
    
Strings.EndUpdate;
  
end;
  
Strings.Free;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  
Str:TStringList;
begin
  Str
:=TStringList.Create;
  if 
dlgOpen1.Execute then
   begin
     Str
.LoadFromFile(dlgOpen1.FileName);
       
ExtractStrings([' '],
                      [
' '],
                      (
PChar(Str.Text)));
   
end;
   
Str.Free;
end; 



مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

جزاك الله خيرا ياأخ وكثر الله من أمثالك

سؤال أخر لو أردت أن أدخل كلمة لأبحث عنها في هذه المصفوفه بحيث الناتج يكون
الكلمة المطلوبه (بإستخدام EditBox )
إسم الملف التي تنتمي له الكلمة
السطر السابق والسطر التالي للكلمة

أنا فكرت بأن أعمل مصفوفتين واحده تضم إسم الملفات التي توجد بداخلها الكلمة والثانيه تضم رقم السطرالذي يحتوي على هذه الكلمة

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

أنا أفكر بطريقه منطقيه ولكنني للأسف لا أستطيع التنفيذ بالدلفي لأنني مبتدئه في التعامل معها فهل ممكن مساعدتي


مصفوفه لعمل Index لملف Text - hanipino - 16-02-2009

ساحاول + ... حاولى . : )


مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

شكرا لك أنا جالسه أحاول بعد فهم طريقتك الرائعه

ما هو عمل الرمز ^ , والرمز #


مصفوفه لعمل Index لملف Text - hanipino - 16-02-2009

ذكرت هذا .. فقط .. لكى لاتسئلينى عن الدالة + ليست طريقتى ..

إقتباس :عملت تغير صغير فقط على الدالة ExtractStrings الموجودة فى الوحدة Classes

انا قلت انى اضفت شىء صغير فقط . و هو :
PHP كود :
if (Strings.IndexOf(Item)< 0) then 
           begin 
            SetLength
(ArrStr,Indx+1); 
            
Strings.Add(Item); 
            
ArrStr[Indx]:=(Item); 
            
Inc(Indx); 
           
end; 

هذه الدالة دالة جاهزة , طايبة من عند (Borland) . صالحة للاكل . Smile

حاولى ان تفهميها .


مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

فهمت ماهي هذه الداله وفهمت التعديل الذي فعلته

شكرا لك .


مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

إستطعت أن أقارن بين الكلمات بطريقه صحيحه كما يلي
PHP كود :
procedure TForm2.Button3Click(Sender: TObject);
var
  
I:LongWord;
  Match:
Boolean;
begin
  Memo1
.Clear;
  for 
I:= Low(WArray)to High(WArray) do
  Match:=
MatchText(Edit1.Text,WArray);
  if Match = 
true then
  Memo1
.Lines.Add(Edit1.Text)
  else 
ShowMessage('Not Found');
end; 

ولكن للأسف لم أستطع وضع السطر السابق والتالي للكلمة ولا إسم الملف


مصفوفه لعمل Index لملف Text - hanipino - 16-02-2009

الدالة MatchText موجودة فى الوحدة StrUtils . لم اجدها فى الدالفى 7 . اطلعى على كود هذه الدالة و حاولى التعديل عليه ( اخذ الاندكس عندما يجد الكلمة ) لقراءت السطر السابق والتالي .
+
لم اجرب الدلة . لاكن ما فائدتها بما انها موجودة ضمن عدة حلقات .. . + يمكن الاستغناء عن بعض المتغيرات .

PHP كود :
Memo1.Clear;
 if  
MatchText(Edit1.Text,WArray) then
     Memo1
.Lines.Add(Edit1.Text)
 else 
ShowMessage('Not Found'); 



مصفوفه لعمل Index لملف Text - NOna - 16-02-2009

أخي يعطيك العافيه ولكني لم أستطيع التعديل على هذه الداله لأنه لا يقبل (IndexOf) عندي لا أعرف لماذا