PDA

View Full Version : سریع ترین راه برای جستجو کارکتری یک فایل



ghasemloo
دوشنبه 27 مرداد 1393, 00:22 صبح
سلام
من یه آرایه A دارم با چند تا عضو کاراکتری
و یه richtextbox دارم که توش یه متن خیلی خیلی طویل(طولانی) هست

خودم با دو تا for تونستم مقادیر تو آرایه Aرو در داخل richtextbox جستجو کنم... به این صورت اما دنبال یه راه سریع تر هستم
برای مثال کاراکتر d داخل آرایه کارکترrichtextbox.text جستجو می کنم اگه کارکتر D با یک از کاراکترهای Richtextboxبرابر بود عدد یک رو بر می گردونه و اگه نبود عدد صفر رو....
با تشکر!!!

sarvmand
دوشنبه 27 مرداد 1393, 01:12 صبح
سلام دوست عزیز بی ادبیه من اینجا حرف بزنم ما انگشت کوچیکه دوستای که اینجا هستن نمیشیم در حد تجربه خودم میگم میتونی با حلقه foresch کار کنی تا نخوای دو بار حلقه بزنی

aminmousavi
دوشنبه 27 مرداد 1393, 01:52 صبح
سلام دوست عزیز ، سوال تون یکم ابهام داشت ، متوجه نشدم که اندکس تمامی رشته هایی که توی richtext هست رو میخواین یا فقط میخواین بدونین توی richtext همچین رشته ای هست یا نه .
اگر فقط میخواهید بدونید رشته درون richtext وجود داره و اندکس رو برگردونه از کد زیر استفاده کن :



String[] arr={"amin","mousavi"};
int result;
foreach (string str in arr)
{
result=richTextBox1.Text.IndexOf(str);
}

ghasemloo
دوشنبه 27 مرداد 1393, 12:01 عصر
دوستان نگاه کنید

char[] ch = richTextBox1.Text.ToCharArray();
char[] dis = ch.Distinct().ToArray();
string[] str = Array.ConvertAll<char,string>(dis,Convert.ToString);
dataGridView1.DataSource = str.Select(x =>new{ Column1 = x }).ToList();
dataGridView1.Columns.Add("Value", "value");

for (int i = 0; i < ch.Length; i++)
{




for (int j = 0; j < dataGridView1.Rows.Count; j++)
{


if (ch[i].ToString() == dataGridView1.Rows[j].Cells[0].Value.ToString())
{
dataGridView1.Rows[j].Cells[1].Value += "1";


}
else
{
dataGridView1.Rows[j].Cells[1].Value += "0";
}
}



دنبال یه راه حلی هستم که با سرعت تر از این کار کنه
مثال=>الان اگه تو ریچ تکست باکس کلمه meysam باشه
برای حرف m کد مقابل رو میده 100001

sobaisobai
دوشنبه 27 مرداد 1393, 18:09 عصر
سلام
ببین این سرعتش چطوره؟
از richtext1 جستجو میکنه و داخل richtext2 میریزه


var listLineText = new List<string>(richTextBoxPrintCtrl1.Text.Split('\n'));
for (int i = 0; i < listLineText.Count; i++)
{
if (listLineText[i].Contains(textBox2.Text.Trim()))
{
int counter = 1;
foreach (string str1 in richTextBoxPrintCtrl1.Text.Split('\n'))
{
if (counter++ == (i + 1))
{
if ((i + 1) % 2 == 0)
{
richTextBoxPrintCtrl2.Text += ((listLineText[i - 1]) + Environment.NewLine + str1);
}
if ((i + 1) % 2 != 0)
{
richTextBoxPrintCtrl2.Text += (str1 + Environment.NewLine + (listLineText[i + 1]));
}
}
}
}
}

ghasemloo
دوشنبه 27 مرداد 1393, 19:08 عصر
یه خورده در مورد کدت توضیح بده
شما کده هایی که من گذاشتم رو دید؟
یه چیز میخوام در اون حد ...........
تکست باکس 2 چیه؟

if (listLineText[i].Contains(textBox2.Text.Trim()))

sobaisobai
دوشنبه 27 مرداد 1393, 19:17 عصر
متن مورد جستجو رو داخل textBox2 بنویس بعد کدی رو که دادم تو رویداد کلیک یه باتن قرار بده

ghasemloo
دوشنبه 27 مرداد 1393, 19:29 عصر
نه زیاد فرق نکرد !!!
بعد من میگم باید صفر یا یک بر گردونه؟
اما این برنامه کاراکتر پس میده؟؟
به این سورس دقت کنید.........

char[] ch = richTextBox1.Text.ToCharArray();
char[] dis = ch.Distinct().ToArray();
string[] str = Array.ConvertAll<char,string>(dis,Convert.ToString );
dataGridView1.DataSource = str.Select(x =>new{ Column1 = x }).ToList();
dataGridView1.Columns.Add("Value", "value");

for (int i = 0; i < ch.Length; i++)
{




for (int j = 0; j < dataGridView1.Rows.Count; j++)
{


if (ch[i].ToString() == dataGridView1.Rows[j].Cells[0].Value.ToString())
{
dataGridView1.Rows[j].Cells[1].Value += "1";


}
else
{
dataGridView1.Rows[j].Cells[1].Value += "0";
}
}

sobaisobai
دوشنبه 27 مرداد 1393, 19:31 عصر
فایلت حدودا چند خط میشه؟

ghasemloo
دوشنبه 27 مرداد 1393, 19:35 عصر
شما فک کن یه نوت پد 10 مگی هست

sobaisobai
دوشنبه 27 مرداد 1393, 19:37 عصر
نه زیاد فرق نکرد !!!
بعد من میگم باید صفر یا یک بر گردونه؟
اما این برنامه کاراکتر پس میده؟؟
به این سورس دقت کنید.........

char[] ch = richTextBox1.Text.ToCharArray();
char[] dis = ch.Distinct().ToArray();
string[] str = Array.ConvertAll<char,string>(dis,Convert.ToString );
dataGridView1.DataSource = str.Select(x =>new{ Column1 = x }).ToList();
dataGridView1.Columns.Add("Value", "value");

for (int i = 0; i < ch.Length; i++)
{




for (int j = 0; j < dataGridView1.Rows.Count; j++)
{


if (ch[i].ToString() == dataGridView1.Rows[j].Cells[0].Value.ToString())
{
dataGridView1.Rows[j].Cells[1].Value += "1";


}
else
{
dataGridView1.Rows[j].Cells[1].Value += "0";
}
}


خب داخل کدی که من دادم شرط داره
من داخل شرط ها گفتم کاراکتر پس بده شما بگید اگه بود 1 برگردونه اگه نبود 0
شما میخوای مثلا ببینی حرف ی چندبار موجود بوده تو فایل درسته؟

ghasemloo
دوشنبه 27 مرداد 1393, 19:41 عصر
بله

var listLineText = new List<string>(richTextBoxPrintCtrl1.Text.Split('\n'));
for (int i = 0; i < listLineText.Count; i++)
{
if (listLineText[i].Contains(textBox2.Text.Trim()))
{
int counter = 1;
foreach (string str1 in richTextBoxPrintCtrl1.Text.Split('\n'))
{
if (counter++ == (i + 1))
{
if ((i + 1) % 2 == 0)
{
richTextBoxPrintCtrl2.Text += "1";
}
if ((i + 1) % 2 != 0)
{
richTextBoxPrintCtrl2.Text += "0";
}
}
}
}
}


اگه حرف m داخل تکست بدی و داخل ریچ بنویسی mahwmam
بجز صفر چیزی بر نمی گردونه

sobaisobai
دوشنبه 27 مرداد 1393, 20:10 عصر
بیا اینو نگاه کن
جستجو میکنی هرچندتا پیدا میشه تو لیبل نشون میده واگه هم پیدا نشه تو else بگو مقدار 0 برگردونه
http://uploadboy.com/56kmg4rlsu73.html

ghasemloo
دوشنبه 27 مرداد 1393, 22:09 عصر
بچه ها راه حل دیگه ای وجود نداره؟:افسرده:

rahnema1
سه شنبه 28 مرداد 1393, 11:27 صبح
بچه ها راه حل دیگه ای وجود نداره؟:افسرده:

فکر کنم اینجور سریعتر می شه

string[] sefroyek(string s)
{
char[] dis=s.Distinct().ToArray();
string[] binary = new string[dis.Length];

byte[] data=System.Text.Encoding.ASCII.GetBytes(s);
short[] data1= new short[s.Length];

Bitmap BMP=new Bitmap( s.Length,1, PixelFormat.Format8bppIndexed);
ColorPalette pal=BMP.Palette;
for (int i = 0; i < pal.Entries.Length; i++) {
pal.Entries[i]=Color.FromArgb(0,0,0);
}

Bitmap BMP1=new Bitmap( s.Length,1, PixelFormat.Format16bppRgb565);
for ( int j=0; j< dis.Length ;j++) {
pal.Entries[(int) dis[j]]=Color.FromArgb(0,0,10);
BMP.Palette=pal;

BitmapData bmpData=BMP.LockBits(new Rectangle(0,0,BMP.Width,BMP.Height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
unsafe
{
System.Runtime.InteropServices.Marshal.Copy (data,0,bmpData.Scan0 ,BMP.Width*BMP.Height);
}
BMP.UnlockBits(bmpData);
Graphics.FromImage(BMP1).DrawImage(BMP,0,0);
BitmapData bmpData1= BMP1.LockBits(new Rectangle( 0,0,BMP.Width,BMP.Height ), ImageLockMode.ReadOnly, PixelFormat.Format16bppRgb565);
unsafe
{
System.Runtime.InteropServices.Marshal.Copy (bmpData1.Scan0 ,data1,0,BMP.Width* BMP.Height);
}
BMP1.UnlockBits(bmpData1);
binary[j]=string.Concat(data1);
pal.Entries[(int) dis[j]]=Color.FromArgb(0,0,0);
}
return binary;
}

این هم روش استفاده:

string[] sefr=sefroyek("meysam");

rahnema1
سه شنبه 28 مرداد 1393, 12:38 عصر
این هم یک راه دیگه

string s = "meysam";
char[] dis=s.Distinct().ToArray();
string[] binary =Enumerable.Repeat(s,dis.Length).ToArray();
for (int i = 0; i < dis.Length; i++) {
binary[i]= System.Text.RegularExpressions.Regex.Replace (binary[i], "[^"+dis[i]+"]","0");
binary[i]= System.Text.RegularExpressions.Regex.Replace (binary[i], "["+dis[i]+"]","1");
}

Mahmoud.Afrad
پنج شنبه 30 مرداد 1393, 18:55 عصر
کد زیر تعداد تکرار هر حرف درون آرایه رو از متن بدست میاره:

string content = File.ReadAllText(Application.StartupPath + "\\a.txt");

char[] chars = { 'f', 'e', 'p', 'd', 'w' };

var charsInContent = content.Where(c => chars.Contains(c));
var countOfChars = from c in charsInContent
group c by c into g
select new
{
Character = g.Key,
Count = g.Count()
};


کد زیر هم یه راه دیگه:

string content = File.ReadAllText(Application.StartupPath + "\\a.txt");

Stopwatch sw = new Stopwatch();
sw.Start();

char[] chars = { 'f', 'e', 'p', 'd', 'w' };

Dictionary<char, UInt16> countOfChars = new Dictionary<char, ushort>();

foreach (char c in chars)
{
countOfChars.Add(c, 0);
}


foreach (char ch in content)
{
if (chars.Contains(ch))
{
countOfChars[ch]++;
}
}