مصفوفه لعمل Index لملف Text
#1
[COLOR="Navy"]السلام عليكم ورحمة الله وبركاته

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

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

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

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

جزاكم الله خيراً
[/COLOR]
الرد
#2
عملت تغير صغير فقط على الدالة 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; 


الملفات المرفقة
.rar   ArrMot.rar (الحجم : 2.09 ك ب / التحميلات : 37)
الرد
#3
جزاك الله خيرا ياأخ وكثر الله من أمثالك

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

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

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

أنا أفكر بطريقه منطقيه ولكنني للأسف لا أستطيع التنفيذ بالدلفي لأنني مبتدئه في التعامل معها فهل ممكن مساعدتي
الرد
#4
ساحاول + ... حاولى . : )
الرد
#5
شكرا لك أنا جالسه أحاول بعد فهم طريقتك الرائعه

ما هو عمل الرمز ^ , والرمز #
الرد
#6
ذكرت هذا .. فقط .. لكى لاتسئلينى عن الدالة + ليست طريقتى ..

إقتباس :عملت تغير صغير فقط على الدالة 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

حاولى ان تفهميها .
الرد
#7
فهمت ماهي هذه الداله وفهمت التعديل الذي فعلته

شكرا لك .
الرد
#8
إستطعت أن أقارن بين الكلمات بطريقه صحيحه كما يلي
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; 

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

PHP كود :
Memo1.Clear;
 if  
MatchText(Edit1.Text,WArray) then
     Memo1
.Lines.Add(Edit1.Text)
 else 
ShowMessage('Not Found'); 
الرد
#10
أخي يعطيك العافيه ولكني لم أستطيع التعديل على هذه الداله لأنه لا يقبل (IndexOf) عندي لا أعرف لماذا
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم