PDA

View Full Version : جستجوی یک رشته در یکسری فایل



debugger
سه شنبه 19 آبان 1388, 14:58 عصر
دوستان من میخوام یه رشته را در یکسری فایل که در یک پوشه قرار دارد را جستجو کنم

خب این قسمتو کدشو نوشتم



string path = @"d:\SearchFolder";
string searchtext = "yahoo";
DirectoryInfo di = newDirectoryInfo(path);
FileInfo[] files = di.GetFiles("*.txt");
foreach (FileInfo file in files)
{
using (StreamReader sr = newStreamReader(file.FullName))
{
string content = sr.ReadToEnd().ToLower();
if (content.Contains(searchtext.ToLower()))
checkedListBox1.Items.Add(searchtext.ToString());
}
}


حالا میخوام بدونم کلمه ای که جسجو کردم در کدام فایل ها هست ؟

خب این کد را هم اضافه کردم



listBox1.Items.Add(file.FullName.ToString());


حالا در یک فایلی بیش از یک کلمه yahoo هست. میخوام تعداد کلمه yahoo را تو فایلی که جستجو شده را بدونم.ولی برنامه اولین کلمه را که پیدا می کنه به فایل بعدی میره


با تشکر

saed2006
سه شنبه 19 آبان 1388, 15:48 عصر
شما فایل رو خط به خط بخون و واسه هر خط کلمه ها رو جدا کن و بر حسب اون کانتر رو افزایش بده تا برسی به اخر فایل
اگه نتونستی بگو کدش رو بزارم واست

debugger
سه شنبه 19 آبان 1388, 16:04 عصر
اگر لطفا کنید نمونه کد را بزارید ممنون میشم . چون تست کردم نشد

saied_genius
سه شنبه 19 آبان 1388, 16:20 عصر
اين يه نمونه با regular expressions:


using System.Text.RegularExpressions;



string path = "c:\\Search";
string searchtext = "yahoo";
DirectoryInfo di = new DirectoryInfo(path);
FileInfo[] files = di.GetFiles("*.txt");
int count = 0;
foreach (FileInfo file in files)
{
using (StreamReader sr = new StreamReader(file.FullName))
{
string contents = sr.ReadToEnd();
MatchCollection matches = Regex.Matches(contents, searchtext);
count = matches.Count;
if (count > 0)
{
listBox1.Items.Add(file.FullName.ToString() + " تعداد:" + count.ToString());
}
}
}

سوالي بود در خدمتم.

موفق باشيد.

saed2006
سه شنبه 19 آبان 1388, 16:39 عصر
توی وقت کمی که داشتم اینو واست اماده کردم
امیدوارم به دردت بخوره

saied_genius
سه شنبه 19 آبان 1388, 16:44 عصر
اين هم يک نمونه با regular expressions به صورت کامل:

موفق باشيد.

debugger
سه شنبه 19 آبان 1388, 16:53 عصر
دوست عزیز ممنون بسیار عالی و کارساز بود

من میخوام که اطلاعات در checked List Box ثبت بشه یعنی کد


listBox1.Items.Add(file.FullName.ToString() + " تعداد:" + count.ToString());

به کد زیر تبدیل بشه



checkedListBox1.Items.Add(file.FullName.ToString() + " ¢م§ں§:" + count.ToString());


حالا میخوام کاربر هر فایلی را که تیکشو زد اون کلمه ای که جستجو کرده را با کلمه مورد نظرش replace بکنه و سیو بکنه

راستی یه مشکل دیگه هم دارم فایل های که در فولدر ای قرار دارند و ما میخواهیم جستجو کنیم از هر فرمتی هستند

مثل txt,php,asp,html,js و ...

خب تو این قسمت



FileInfo[] files = di.GetFiles("*.txt");


search pattern را هر طوری تعریف می کنم خطا میده

و یه نکته دیگه که موقع سیو کردن نباید encoding فایل به هم بخوره

saed2006
سه شنبه 19 آبان 1388, 17:06 عصر
دوست عزیز از
System.Text.RegularExpressions.Regex.Replace
استفاده کن

saed2006
سه شنبه 19 آبان 1388, 17:17 عصر
برای encoder هم
file.CurrentEncoding
میتونی استفاده کنی

saied_genius
سه شنبه 19 آبان 1388, 17:30 عصر
سلام
اين هم يک نمونه کامل و عملي (100% تست شده)

سوالي بود در خدمتم.

موفق باشيد.

debugger
سه شنبه 19 آبان 1388, 17:50 عصر
سلام
اين هم يک نمونه کامل و عملي (100% تست شده)

سوالي بود در خدمتم.

موفق باشيد.

اقا دستت درد نکنه بی نهایت سپاس

اگر لطفا کنید یه توضیحی در مورد این کد بدین



foreach (var item in checkedListBox1.CheckedItems)
{
string it = item.ToString().Split(new char[] { '>' }).First<string>().Trim();
FileInfo fi = new FileInfo(it);
FileStream fs = new FileStream(it, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
StreamReader sr = new StreamReader(fs);
string str = "";
str = sr.ReadToEnd();
str = str.Replace(txtOld.Text, txtNew.Text);
fs.Position = 0;
fs.SetLength(str.Length);
sw.Write(str);
sw.Flush();
sw.Close();
fs.Close();
}


fs.Position = 0

و

string it = item.ToString().Split(new char[] { '>' }).First<string>().Trim();

یکمی توضیح بدین

با تشکر

saied_genius
سه شنبه 19 آبان 1388, 17:59 عصر
اقا دستت درد نکنه بی نهایت سپاس

اگر لطفا کنید یه توضیحی در مورد این کد بدین



foreach (var item in checkedListBox1.CheckedItems)
{
string it = item.ToString().Split(newchar[] { '>' }).First<string>().Trim();
FileInfo fi = newFileInfo(it);
FileStream fs = newFileStream(it, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter sw = newStreamWriter(fs);
StreamReader sr = newStreamReader(fs);
string str = "";
str = sr.ReadToEnd();
str = str.Replace(txtOld.Text, txtNew.Text);
fs.Position = 0;
fs.SetLength(str.Length);
sw.Write(str);
sw.Flush();
sw.Close();
fs.Close();
}
fs.Position = 0

و

string it = item.ToString().Split(newchar[] { '>' }).First<string>().Trim();

یکمی توضیح بدین

با تشکر

fs.possition=0 يعني محل شروع نوشتن متن براي save کردن را از اول فايل قرار مي دهيم.


string it = item.ToString().Split(newchar[] { '>' }).First<string>().Trim();
چون ما آمديم و تعداد کاراکتر ها را هم در گزينه هاي checkedlistbox آورده ايم ، مجبوريم که يه جوري قسمت اضافه را حذف کنيم و فقط مسير فايل را (براي پردازش هاي بعدي) نگه داريم.
چون کار عجله اي بود ، نمي دانم بهترين راه را انتخاب کرده ام يا نه ، ولي در هر صورت جواب مي دهد.

ما ابتدا رشته متن هر گزينه انتخابي را از کاراکتر > (که بعد از آن مربوط به تعداد است و نيازي براي قسمت هاي بعدي به آن نداريم) جدا مي کنيم (split مي کنيم)يعني در اصل رشته را به دو رشته مي شکنيم.

سپس با قسمت first<string> قسمت اول رشته که مربوط به مسير و نام فايل است را بر ميگردانيم و با trim فاصله هاي اضافي را حذف مي کنيم.

از fs.SetLength(str.Length); هم استفاده مي کنيم (و به صورت بايتي، اندازه را نمي دهيم) چون برخي کاراکتر ها بيش از يک بايت هستند.

سوالي بود در خدمتم.

موفق باشيد.

debugger
سه شنبه 19 آبان 1388, 18:20 عصر
کد های زیر در برنامه من ارور میده ولی در برنامه شما ارور نمیده . دو برنامه هیچ فرقی با هم ندارن ؟؟؟؟



foreach (var item in checkedListBox1.CheckedItems)
{
string it = item.ToString().Split(new char[] { '>' }).First<string>().Trim();
FileInfo fi = new FileInfo(it);
FileStream fs = new FileStream(it, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
StreamReader sr = new StreamReader(fs);
string str = "";
str = sr.ReadToEnd();
str = str.Replace(textBox2.Text, textBox3.Text);
fs.Position = 0;
fs.SetLength(str.Length);
sw.Write(str);
sw.Flush();
sw.Close();
fs.Close();
}
//
MessageBox.Show("¤ںïگھïëï ں êيهçï¢ ںë¤ںê ¬§");
}


عکس خطا ضمیمه شد

saied_genius
سه شنبه 19 آبان 1388, 18:28 عصر
error که مي دهد فکر مي کنم مربوط به مسير آدرس هست.

چون تمام کد را نمي بينم ، فقط مي توانم حدث بزنم.

شما @ اول مسير فايل را توي سورس گذاشته ايد؟

اگر گذاشته ايد برداريد.

اگر مي خواهيد به صورت دستي آدرس بدهيد به جاي استفاده از @ از همان \\ استفاده کنيد.

در هر صورت error مربوط به مسير فايل ورودي است.

در صورت امکان کد هاي بيشتري را بگذاريد تا بتوانم بهتر راهنمايي کنم.

موفق باشيد.

saied_genius
سه شنبه 19 آبان 1388, 18:37 عصر
دقت نکردي ...




string it = item.ToString().Split(newchar[] { '>' }).First<string>().Trim();چون ما آمديم و تعداد کاراکتر ها را هم در گزينه هاي checkedlistbox آورده ايم ، مجبوريم که يه جوري قسمت اضافه را حذف کنيم و فقط مسير فايل را (براي پردازش هاي بعدي) نگه داريم.
چون کار عجله اي بود ، نمي دانم بهترين راه را انتخاب کرده ام يا نه ، ولي در هر صورت جواب مي دهد.

ما ابتدا رشته متن هر گزينه انتخابي را از کاراکتر > (که بعد از آن مربوط به تعداد است و نيازي براي قسمت هاي بعدي به آن نداريم) جدا مي کنيم (split مي کنيم)يعني در اصل رشته را به دو رشته مي شکنيم.

و فقط رشته اول که مربوط به آدرس فايل است را استفاده مي کنيم.

ديدي دقت نکردي!!

در هر صورت برات اصلاح کردم ، حالا جواب مي دهد.

سوالي بود در خدمتم.

موفق باشيد.

debugger
چهارشنبه 20 آبان 1388, 14:16 عصر
دوست عزیز برنامه کلمه های فارسی را جستجو نمی کنه ؟ چطوری باید این مشکل را حل کرد ؟

اَرژنگ
چهارشنبه 20 آبان 1388, 15:09 عصر
دوست عزیز برنامه کلمه های فارسی را جستجو نمی کنه ؟ چطوری باید این مشکل را حل کرد ؟

جناب saied_genius زحمت کشیدن و برنامه را فرستادند، شما هم فایلهایی را که باهاشان امتحان میکنید بفرستید و یاریشان کنید
اینکه یک چیزی کار نمیکنه ممکنه دلایل مختلفی داشته باشد، ولی بدانه داشتن فایلهایی که برایه شما کار
نمیکنه این آسان نیست.
ایشان پروژه کامل میفرستند، لااقل کد کامل را بدین خدمتشان

debugger
چهارشنبه 20 آبان 1388, 15:14 عصر
دوست عزیز سورس کامل را در اختیار ایشان قرار دادم .

من هیچ فایلی ندارم . یه فایل txt ایجاد کنید و داخل ان فارسی یه چیزی بنویسید و انرا جستجو کنید

همین.

saied_genius
چهارشنبه 20 آبان 1388, 15:57 عصر
من با فيل text امتحان کردم ، مشکلي نداشت.

فقط دقت کنيد که code page صفحه براي فارسي حتماً UTF-8 باشد.

در مواردي که فايل هاي ديگر را مي خواهيد سرچ کنيد نمي دانم ، ولي براي فايل text هنگام save بزنيد save as و از combo پايين نام فايل ، نوع UTF-8 را انتخاب کنيد (پيش فرض ANSI است).

با اين روش من سرچ کردم و جايگزيني کاملاً جواب داد.

سوالي بود در خدمتم.

موفق باشيد.

debugger
چهارشنبه 20 آبان 1388, 16:19 عصر
درسته منم مثل فرمایشات شما تست کردم جواب داد

من میخوام یه progress bar برای سرچ بزارم . حالا شما فکر کنید تعداد فایل زیاده . عملیات کمی زمانبر میشه

بعنوان مثال شما system32 را انتخاب کنید و 0 را سرچ کنید

من از background worker استفاده کردم . اما نمی دونم چطوری باید پیشروی کنم

یعنی backgroundWorker1.ReportProgress

باید با چی ادامه پیدا کنه ؟؟

saied_genius
چهارشنبه 20 آبان 1388, 16:24 عصر
من به شخصه از backgroundworker استفاده نکرده ام و نمي دانم چگونه کار مي کند ، ولي احتمالاً خودش براي شما يک thread ديگر ، مجزا از thread شما مي سازد و عمليات را درون آن اجرا مي کند.

اما مي توانيد خودتان از multi threading يا چند ريسماني استفاده کنيد و progress خود را در فرم اصلي و عمليات جستجو را در thread ساخته شده انجام دهيد.

يک متغير static هم براي ذخيره و چک کردن فايل هاي جستجو شده قرار دهيد و مقدار آن را به progress bar پاس دهيد.

مواردي را که گفتم تماماً در اين سايت بحث شده و براي همه آنها راه حل وجود دارد.

سوالي بود در خدمتم.

موفق باشيد.