View Full Version : جستجو در فایل تکست
Mask
چهارشنبه 26 فروردین 1388, 21:08 عصر
با سلام به همه دوستان
من یه فایل تکست دارم که حدود 100 خط نوشته داره حالا می خام کلمه reza رو در اون جستجو کنم.
کلمه reza خودش 4 کارکتر هست می خام تا 7 کارکتر بعدش رو بتونم جدا کنم و با کلمه رضا بریزم تو یه ادیت.
ممنون اگه جوابمو بدید.
مثلا:
rezarahmani
میخام وقتی reza رو پیدا کرد تا 7 کارکتر بعدش که بشه rahmani بریزه تو یه ادیت.
Felony
چهارشنبه 26 فروردین 1388, 23:08 عصر
این کد رو براتون نوشتم ، اگر متوجه نشدید چی کار میکنه بگید تا براتون توضیح بدم چون همین جوری از خودم نوشتم و شاید از این بهینه تر هم بشه این عملیات رو انجام داد ...
var
Fi:TStringList;
I: Integer;
Temp,SearchWord:string;
begin
SearchWord:='Silver';
Fi:=TStringList.Create;
Fi.LoadFromFile('D:\Test.txt');
for I:=0 to Fi.Count-1 do begin
Temp:=Fi.Strings[I];
Temp:=Copy(Temp,0,Length(SearchWord));
if Temp=SearchWord then ShowMessage(Fi.Strings[I]);
end;
shervin farzin
چهارشنبه 26 فروردین 1388, 23:11 عصر
سلام
يه راه اينه كه دوست خوبم SilverSoft فرمودند . يه راه ديگه هم ميشه اين :
كلمه مورد جستجو رو در Edit1 مينويسيد و در صورت پيدا شدن در متن فايل ، 7 كاركتر بعد از
موقعيت كلمه پيدا شده در Edit2 نمايش داده ميشه .
var
i:integer;
Source_text,Pattern:string;
z:TextFile;
begin
Pattern:=edit1.Text;
AssignFile(z,'C:\test.txt');
Reset(z);
try
while not Eof(z) do
begin
ReadLn(z,Source_text);
for i := 1 to length(Source_text) do
if copy(Source_text,i,length(Pattern))=Pattern then edit2.Text:=copy(Source_text,i+length(Pattern),7);
end;
finally
CloseFile(z);
end;
موفق باشيد.
vcldeveloper
پنج شنبه 27 فروردین 1388, 02:28 صبح
function ExtractTextFromFile(const SearchWord: string; const FileName: TFileName): string;
var
SList : TStringList;
WordPos : integer;
begin
SList := TStringList.Create;
try
SList.LoadFromFile(FileName);
WordPos := Pos(SearchWord,SList.Text);
if WordPos > 0 then
Result := Copy(SList.Text,WordPos,Length(SearchWord)+4);
finally
SList.Free;
end;
end;
نحوه استفاده:
Edit1.Text := ExtractTextFromFile('Reza','C:\Test.txt');
1485159
پنج شنبه 27 فروردین 1388, 20:53 عصر
کد:
var i:integer; Source_text,Pattern:string; z:TextFile;beginPattern:=edit1.Text;AssignFile(z,' C:\test.txt');Reset(z);try while not Eof(z) do begin ReadLn(z,Source_text); for i := 1 to length(Source_text) do if copy(Source_text,i,length(Pattern))=Pattern then edit2.Text:=copy(Source_text,i+length(Pattern),7); end;finally CloseFile(z);end;میشه اینو سطر به سطر توضیح بدید؟
shervin farzin
جمعه 28 فروردین 1388, 01:03 صبح
سلام
از اولين خط بعد از Begin شروع ميكنم .
خط 1 كار خاصي نميكنه فقط الگويي كه بايد در متن جستجو بشه رو داخل يه متغيير قرار ميده .
خط 2 ، متغيير Z رو كه از نوع TextFile هست مربوط ميكنه به فايل متني به نام Test.txt .
خط 3 فايل متني رو آماده براي خوندن ميكنه .
خط 5 يه حلقه است كه براي تك تك خط هاي فايل متني تكرار ميشه .
خط 7 اولين سطر از فايل متني رو ميخونه و داخل متغييري به نام Source_text قرار ميده .
( Source_text همون رشته اي كه بايد Pattern رو در اون جستجو كنم ) . در ضمن اشاره گر خط به
ابتداي خط بعدي منتقل ميشه .
خط 9 برش هايي از Source_text ، به طول Pattern رو با محتويات Pattern مقايسه ميكنه . در صورتي كه نتيجه مقايسه True بود ، 7 كاركتر بعد از محل پيدا شدن Pattern ، از Source_text
رو داخل Edit قرار ميده .
خط 12 فايل متني باز شده رو ميبنده .
موفق باشيد .
1485159
جمعه 28 فروردین 1388, 09:50 صبح
try
while not Eof(z) do
begin
ReadLn(z,Source_text);
for i := 1 to length(Source_text) do
if copy(Source_text,i,length(Pattern))=Pattern then edit2.Text:=copy(Source_text,i+length(Pattern),7);
end;
finally
CloseFile(z);
من این قسمت رو نمیتونم درک کنم اگه میشه آرمانگون دستوراتی رو استفاده کردین بنویسین تا بهتر یاد بگیرم.(آخه مبتدی هستم)
ممنون،دست شما درد نکنه.
shervin farzin
جمعه 28 فروردین 1388, 12:14 عصر
سلام
چشم :
1- دستور EOF كه يه متغيير از نوع اشاره گر به فايل رو ميگيره و تا زماني كه اشاره گر به انتهاي
فايل نرسيده باشه مقدار False بر ميگردونه ، زماني كه به انتهاي فايل برسه True ميشه .
2- دستور Readln يك سطر از فايل متني رو ميخونه . اين دستور دو پارامتر ميگيره ، اولي متغييري
هست كه به فايل متني اشاره ميكنه . دومي متغييري هست كه اون يك سطر خونده شده از
فايل ، داخلش قرار ميده .
3- دستور Length كه يه متغيير از نوع String ميگيره ، تعداد كاركتر هاي اون رشته رو ميشمره و
نتيجه رو به صورت يك عدد Integer بر ميگردونه .
4- دستور Copy يك برش از رشته رو برميگردونه . اين دستور سه پارامتر ميگيره . اولي رشته اي
هست كه بخشي از اون رو ميخوايم . دومي شماره كاركتري هست كه برش بايد از اونجا شروع
بشه . سومي طول برش هست . مثلا زير رو در نظر بگيريد :
var
x:string;
y:string;
begin
x:='ABCDEFGH';
y:=Copy(x,2,5);
showmessage(y);
در اين مثال برشي از كاركتر شماره 2 ( يعني B ) در رشته X ، به طول 5 ايجاد ميشه و نتيجه
داخل Y ذخيره ميشه . با اجراء اين كد مقدار
BCDEF
نمايش داده ميشه .
5- دستور CloseFile هم يك پارامتر از نوع File ميگيره و فايل اصلي رو در ديسك از گرو اشاره گر به
اون فايل خارج ميكنه . ( البته در صورتي كه فايل رو قبلا Open كرده باشيد . در كد من ، فايل با
دستور Reset باز شده بود . )
براي اطلاعات بيشتر در مورد ساير حالتهاي استفاده از دستورات فوق به سايت زير مي تونيد مراجعه كنيد .
www.delphibasics.co.uk
موفق باشيد .
1485159
جمعه 28 فروردین 1388, 21:03 عصر
ممنون از شما بسیار مفید بود ولی یه مشکل دارم!
try
برای چیه!؟..
1- دستور EOF كه يه متغيير از نوع اشاره گر به فايل رو ميگيره و تا زماني كه اشاره گر به انتهاي
فايل نرسيده باشه مقدار False بر ميگردونه ، زماني كه به انتهاي فايل برسه True ميشه .
معنی این رو هم نفهمیدم!
ممنون.
shervin farzin
جمعه 28 فروردین 1388, 22:33 عصر
سلام
دستور EOF كه يه متغيير از نوع اشاره گر به فايل رو ميگيره و تا زماني كه اشاره گر به انتهاي
فايل نرسيده باشه مقدار False بر ميگردونه ، زماني كه به انتهاي فايل برسه True ميشه .
فرض كنيد زماني كه متغيير z رو Assign مي كنيد به فايل test.txt يك فلش كوچيك ( اشاره گر ) به
اولين خط از فايل test.txt اشاره كنه . با هر بار اجراء دستور Readln اين فلش كوچيك يك خط مياد
پايين تر يعني به خط دوم حالا داره اشاره ميكنه . اين كار اون قدر تكرار ميشه تا زماني كه اين
اشاره گر از آخرين خط فايل test.txt رد ميشه ، چون بعد آخرين خط ديگه هيچ خطي نيست كه
بهش اشاره بشه ، اون فلش كوچيك اعلام ميكنه كه به انتهاي فايل رسيده . دستور EOF فقط
تست ميكنه كه اشاره گر از آخرين خط فايل رد شده يا نه .
اما دستور Try :
اين يه دستور بسيار موثر براي مديريت حافظه و خطا در برنامست . به دو شكل try - except و
try - finally استفاده ميشه .
try
// try body
except
// except body
end;
در اين حالت كه عموما براي مديريت خطا استفاده ميشه شما كدهاي برنامه خودتون رو در بدنه
try مي نويسيد . حالا اگر به هر دليلي در حين اجراء اين كد ها خطايي به وجود بياد گرداننده برنامه
كد هاي بدنه except رو اجراء ميكنه . اما اگر بدنه try بدون اشكال اجراء بشه ، كد هاي بدنه except
اجراء نخواهند شد .
try
// try body
finally
// finally body
end;
در اين حالت كه براي مديريت حافظه هاي تخصيص پيدا كرده توسط كاربر هست ، مثل حالت قبل
كد هاي برنامه در بدنه try نوشته ميشن با اين تفاوت كه چه فرايند اجراء بدنه try با موفقيت انجام
بشه و چه به خاطر خطا با شكست روبرو بشه ، كدهاي بدنه finally بي برو برگرد اجراء ميشن.
حالا به try - finally كه در برنامه من يا برنامه آقاي كشاورز نوشته شده نگاه كنيد .
من در خط قبل از try ، با دستور Reset فايل رو باز كردم ، بعد كدهاي برنامه رو در بدنه try نوشتم
و در بدنه finally ، فايل باز شده رو بستم و خيالم راحته كه اگه در بدنه try خطايي به وجود بياد
حتما در انتها فايل با دستور CloseFile بسته ميشه . همينطور در كد آقاي كشاورز پيش از try
حافظه اي براي متغيير Slist تخصيص داده شده . كد ها در بدنه try نوشته شدن و در بدنه finally
حافظه مربوط به متغيير Slist آزاد شده ، كه به اين ترتيب اطمينان داريم كه تحت هر شرايطي
حافظه Slist آزاد خواهد شد .
موفق باشيد .
1485159
جمعه 28 فروردین 1388, 23:03 عصر
با عرض معضرت.
تمامی مطالبی که شما گفتید درست و خیلی هم به جاست ولی من بازم نفهمیدم!!!!!
ReadLn(z,Source_text);
for i := 1 to length(Source_text) do
اگه این دو قسمت رو هم به طور کامل توضیح بدید ممنون میشم!
دستتون درد نکنه!
1485159
شنبه 29 فروردین 1388, 00:17 صبح
بلخره خودم یدونه نوشتم(در حالی که باور هم نمیکردم که بتونم)(آخه یه ماهه که دلفی رو شروع کردم)(خوب سن رو هم باید حساب کرد!)
var y:string;
x:textfile;
w:string;
d:integer;
begin
AssignFile(x,'c:\test.txt');
Reset(x);
while not Eof(x) do begin
readln(x,w);
for d:=1 to length(w) do
if copy(w,d,length(edit1.Text))=edit1.Text then edit2.Text:=w;
end;
vcldeveloper
شنبه 29 فروردین 1388, 00:58 صبح
بلخره خودم یدونه نوشتم(در حالی که باور هم نمیکردم که بتونم)(آخه یه ماهه که دلفی رو شروع کردم)(خوب سن رو هم باید حساب کرد!)
البته این روشی که روش کار کردید مربوط به پاسکال میشه، و برای Backward Compatibility در دلفی هنوز پشتیبانی میشه.
1485159
شنبه 29 فروردین 1388, 09:01 صبح
البته این روشی که روش کار کردید مربوط به پاسکال میشه، و برای Backward Compatibility در دلفی هنوز پشتیبانی میشه.
منظورتون رو نفهمیدم!!!!
یعنی قدیمیه!؟..
اشکال داره!؟.
ممنون.
vcldeveloper
شنبه 29 فروردین 1388, 09:56 صبح
یعنی قدیمیه!؟..
این نوع روش باز کردن فایل مربوط به پاسکال هست که بعدا با پیدایش دلفی به عنوان جایگزینی برای Turbo Pascal تحت ویندوز، به دلفی هم منتقل شد. علاوه بر این روش قدیمی، روش های دیگه ایی هم برای باز کردن فایل در دلفی وجود داره که جدیدتر و بهینه تر هستند، مثل استفاده مستقیم از توابع API ویندوز، یا خواندن فایل بوسیله Stream.
در مورد موضوع این تاپیک که درباره فایل های متنی هست، میشه با استفاده از کلاس TStringList دلفی یک فایل متنی را به راحتی در حافظه لود کرد، و به سطرهای آن دسترسی داشت:
MyList := TStringList.Create;
try
MyList.LoadFromFile('C:\Test.txt');
finally
MyList.Free;
end;
برای دسترسی به هر یک از سطرهای فایل:
for Line in MyList do
ShowMessage(Line);
کد بالا هر خط از فایل متنی لود شده در شی فرضی MyList را می خواند، و در متغیر فرضی Line ذخیره می کند، و توسط تابع ShowMessage آن را نمایش می دهد.
1485159
شنبه 29 فروردین 1388, 10:18 صبح
for Line in MyList do ShowMessage(Line);دستور بالا رو میزارمم و فایل رو هم لود کردم ولی ارور میده!MyList.Free;برای چیه!؟ممنون.
vcldeveloper
شنبه 29 فروردین 1388, 10:47 صبح
!MyList.Free;برای چیه!؟
آزاد کردن حافظه اختصاص داده شده به شی MyList.
for Line in MyList do ShowMessage(Line);دستور بالا رو میزارمم و فایل رو هم لود کردم ولی ارور میده!
for...in از دلفی 2007 به بعد به زبان دلفی اضافه شده. اگر نسخه های قدیمی تر دلفی را دارید، باید بجاش از ساختار حلقه for عادی استفاده کنید:
for i := 0 to MyList.Count-1 do
ShowMessage(MyList[i]);
دقت کنید که در این کدها من بخش var مربوط به تعریف متغیرها را نگذاشتم. اگر پیام خطایی که دریافت می کنید، مربوط به نشناختن یک متغیر هست، باید خودتون آن متغیر را تعریف کنید، مثلا:
var
MyList : TStringList;
Line : string;
i : integer;
1485159
شنبه 29 فروردین 1388, 17:54 عصر
آزاد کردن حافظه اختصاص داده شده به شی MyList.خوب اگه از این دستور استفاده نکنیم چیمیشه!؟..
-------------------------------
در مورد این هم توضیح بدین خوب میشه!
MyList.Count-1
-----------------------------
WordPos
این چیه!؟
vcldeveloper
شنبه 29 فروردین 1388, 18:31 عصر
خوب اگه از این دستور استفاده نکنیم چیمیشه!؟.
نشت حافظه (Memory Leak) رخ میده.
در مورد این هم توضیح بدین خوب میشه!
MyList.Count-1
MyList.Count تعداد سطرهای نگهداری شده در MyList را برمیگردانه. شماره سطرها از صفر شروع میشه، پس برای دسترسی به این سطرها از صفر تا تعداد سطرها منهای یک باید خوانده بشه.
WordPos
این چیه!؟
اگر به دقت به کد تابع نوشته شده دقت کنید، می بینید که WordPos متغیری هست که بصورت WordPos : integer تعریف شده، و خروجی تابع Pos را در خودش نگهداری میکنه.
Mask
دوشنبه 31 فروردین 1388, 17:14 عصر
ممنون از دوستان عزیز
بنده از کد جناب shervin farzin (http://barnamenevis.org/forum/member.php?u=71100) استفاده کردم.
و اومدم دوتا ادیت گذاشتم و در ادیت اولی کلمه مورد نظرم رو نوشتم و در ادیت دوم نسبت به نیاز برنامم گفتم که تا 50 کارکتر بعد رو بریزه.
حالا یه مشکلی پیش اومده.
مثال:
من در فایل تکستم در خط 5 که به صورت زیر است
Time: 4/12/2009 00:17:05.515
Type: Warning
Category: 112
Event ID: 5379
alirezawww.yahoo.com
The description for this event could not be found. It contains the following
insertion string(s):
Server Application ID: {02D4B3F1-FD88-11D1-960D-00805FC79235}
Server Application Instance ID:
{3ACC5D43-EADA-481D-93AC-2C528A3F903B}
Server Application Name: System Application
The serious nature of this error has caused the process to terminate.
Error Code = 0x8004d01c : A connection with the transaction manager was
lost.
COM+ Services Internals Information:
File: d:\qxp_slp\com\com1x\src\comsvcs\context\context.c pp, Line: 167
Comsvcs.dll file version: ENU 2001.12.4414.312 shp
در ادیت اول می نویسم alireza و در ادیت دوم www.yahoo.com (http://www.yahoo.com) رو نشونم میده.
اما یه مسکل هست اونم اینه که من به برنامم گفتم وقتی ادیت دوم چنج شد آدرس سایت درون ادیت دوم رو باز کن.
حالا در ادیت دوم فقط مسیر www.yahoo.com (http://www.yahoo.com) نیست بلکه یه فاصله آخرش هست که کار رو خراب میکنه.
وقتی میره این مسیر باز شه مسیر زیر باز میشه...
www.yahoo.com%20 (http://www.yahoo.com%20)
که هیچ سایتی باز نمیشه.
اومدم و خط زیر رو نوشتم
Edit2.Text := copy(Edit2.Text,1,Edit2.GetTextLen-1);
یعنی یه دونه از کارکتر آخری رو پاک کن الان این کار رو انجام میده اما رندوم.
یعنی چی.
اگه متن درون ادیت دوم بلند بود بازم یه فاصله آخرش میزاره. یا گاهی وقتا مثلا سایت www.yahoo.com (http://www.yahoo.com) رو m آخرش رو پاک میکنه.
باید چیکار کنم.
shervin farzin
دوشنبه 31 فروردین 1388, 23:18 عصر
سلام
اگر انتهاي رشته با كاركتر Space تموم ميشه ، كافيه شما به كمك تابع TrimRight ، فاصله هاي
انتهاي رشته اي رو كه در Edit2 داريد حذف كنيد . اگر هم مطمئن نيستيد كه Space در ابداي
رشته هست يا انتهاي اون ، از تابع Trim استفاده كنيد كه فاصله ها رو از هر دو سمت رشته
( اگر وجود داشته باشند ) حذف ميكنه .
موفق باشيد .
Mask
سه شنبه 01 اردیبهشت 1388, 10:50 صبح
بازم ممنون و دستت گلت درد نکنه.
میشه طرز استفادشو تو یه مثال بگی چطوری؟
shervin farzin
سه شنبه 01 اردیبهشت 1388, 11:44 صبح
سلام
مثالا به جاي خطي كه شما در برنامتون نوشتيد :
Edit2.Text := copy(Edit2.Text,1,Edit2.GetTextLen-1);
بايد بنويسيد :
Edit2.Text:=TrimRight(Edit2.Text);
يا
Edit2.Text:=Trim(Edit2.Text);
موفق باشيد .
mrm0101
جمعه 21 آبان 1389, 01:33 صبح
هر چند موضوع اين بحث مربوط به گذشته است ولي اگر منظورتون جايگزيني يك كلمه در داخل يك رشته است در دلفي 2010 از كد زير استفاده كنيد گ
s:='mohammad reza jahani'
s:=StringReplace(s,'reza','ali',[rfReplaceAll]);
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.