كيف أستطيع أن أعمل مصفوفه لمحتوى ملف تكست (ملف تكست محتوياته ثابته) بحيث تكون كل كلمه لها رقم إندكس خاص يها وغير متكرر
مثال: لو عندي جملة "how are you are you ok"
Array[0]= how
Array[1]= are
Array[2]= you
Array[4]= ok
بمعنى لا يمكن أن نكررare أو you في رقم إندكس جديد لأنهم قد عرفوا سابفا (مع العلم أن الملف كبير جدا ومحتواه لا يقل عن الأف الكلمات ولا يمكن تعريف كلمة كلمة )
عملت تغير صغير فقط على الدالة ExtractStrings الموجودة فى الوحدة Classes
-
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;
سؤال أخر لو أردت أن أدخل كلمة لأبحث عنها في هذه المصفوفه بحيث الناتج يكون
الكلمة المطلوبه (بإستخدام EditBox )
إسم الملف التي تنتمي له الكلمة
السطر السابق والسطر التالي للكلمة
أنا فكرت بأن أعمل مصفوفتين واحده تضم إسم الملفات التي توجد بداخلها الكلمة والثانيه تضم رقم السطرالذي يحتوي على هذه الكلمة
وفي الإظهار بعد كل بحث عن كلمة معينه تظهر الكلمة إسم الملف والسطر السابق والتالي للكلمة
أنا أفكر بطريقه منطقيه ولكنني للأسف لا أستطيع التنفيذ بالدلفي لأنني مبتدئه في التعامل معها فهل ممكن مساعدتي
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;
ولكن للأسف لم أستطع وضع السطر السابق والتالي للكلمة ولا إسم الملف
الدالة MatchText موجودة فى الوحدة StrUtils . لم اجدها فى الدالفى 7 . اطلعى على كود هذه الدالة و حاولى التعديل عليه ( اخذ الاندكس عندما يجد الكلمة ) لقراءت السطر السابق والتالي .
+
لم اجرب الدلة . لاكن ما فائدتها بما انها موجودة ضمن عدة حلقات .. . + يمكن الاستغناء عن بعض المتغيرات .
PHP كود :
Memo1.Clear; if MatchText(Edit1.Text,WArray) then Memo1.Lines.Add(Edit1.Text) else ShowMessage('Not Found');