PDA

View Full Version : سوال: چه طوری میشه یک خط خاص در فایل متنی رو پیدا کرد



NasimBamdad
یک شنبه 03 فروردین 1393, 20:43 عصر
سلام .

فرض کنیم یک فایل متنی داریم که از خطوط متفاوتی تشکیل شده

چه طوری میشه شماره خطی که مثلا برابر با "aaaa" می باشد رو پیدا کرد و مقدارش رو داشته باشیم و شماره اون خط رو در بیاریم !!

abdullah20
یک شنبه 03 فروردین 1393, 20:53 عصر
int counter = 0; string line;
System.IO.StreamReader file = new System.IO.StreamReader("test.txt");
while ((line = file.ReadLine()) != null)
{
if (line == "text")
{
this.Text = counter.ToString();
}


counter++;
}


file.Close();

NasimBamdad
یک شنبه 03 فروردین 1393, 21:23 عصر
شماره خط رو الان از کجای این سورس میشه پیدا کرد؟

shahryari
یک شنبه 03 فروردین 1393, 22:02 عصر
شماره خط رو الان از کجای این سورس میشه پیدا کرد؟

سلام
در كدهاي فوق ، شماره خط رو ميتونيد در this.Text مشاهده كنيد

NasimBamdad
یک شنبه 03 فروردین 1393, 23:28 عصر
ببینید من یک فایل txt دارم با این محتویات :







[import]
[/export]


بعد کد رو به صورت زیر تغییر دادم


try
{


int counter = 0; string line;
System.IO.StreamReader file = new System.IO.StreamReader(radTextBoxControl2.Text);
while ((line = file.ReadLine()) != null)
{
if (line == "[/update]")
{
this.Text = counter.ToString();
}
counter++;
MessageBox.Show(Convert.ToString(counter));
}




file.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


شماره خطوط رو به من 1 و 2 و 3 و 4 و 5 و 6 میده .

در صورتی که باید فقط شماره خط 4 رو بده .

اشکال کجاست !؟

NasimBamdad
دوشنبه 04 فروردین 1393, 07:49 صبح
خبری نیست !؟

NASA's Spaceman
دوشنبه 04 فروردین 1393, 09:32 صبح
من دقیقا مطمین نیستم که اینی که میگم عملی میشه یا نه ولی باید از دستور length استفاده کنی و وقتی طول رشته رو بدست آوردی بگی از این شماره تا این شماره رو نمایش بده
چون Length طول شته رو بصورت عدد میگه و اگه این کار رو بکنی به گمونم بتونی یه تیکه مورد نظرت رو جدا کنی
با سپاس

shahryari
دوشنبه 04 فروردین 1393, 10:21 صبح
سلام
اگر شما یک فایل داشته باشید به شرح زیر

asad
asd
asdsadsa
sd
fff
aaa
hhhh
fdg
dfgdf
ddfgdf

و بخواهید شماره خطی را که متن آن aaa است را بدست بیاورید
آنگاه داریم :
string[] s= System.IO.File.ReadAllLines(@"C:\test.txt");
for (int i = 0; i < s.Length; i++)
{
if (s[i] == "aaa")
{
textBox1.Text = (i+1).ToString();
}
}

اگرهم میخوای بصورت تابع بنویسی که دوتا پارامتر میگیره اولی نام و ادرس فایل متنی و دومی هم ایتمی که میخوای شماره خطشو بگیری
public int GetLineNum(string fileNeme, string item)
{
int line_num = 0;
string[] s = System.IO.File.ReadAllLines(fileNeme);
for (int i = 0; i < s.Length; i++)
{
if (s[i] == item)
{
line_num = i + 1 ;
}
}
return line_num;
}
و برای فراخوانی تابع
textBox1.Text = GetLineNum(@"C:\test.txt", "aaa").ToString();

موفق باشید

abdullah20
دوشنبه 04 فروردین 1393, 10:40 صبح
ببینید من یک فایل txt دارم با این محتویات :







[import]
[/export]


بعد کد رو به صورت زیر تغییر دادم


try
{


int counter = 0; string line;
System.IO.StreamReader file = new System.IO.StreamReader(radTextBoxControl2.Text);
while ((line = file.ReadLine()) != null)
{
if (line == "[/update]")
{
this.Text = counter.ToString();
}
counter++;
MessageBox.Show(Convert.ToString(counter));
}




file.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


شماره خطوط رو به من 1 و 2 و 3 و 4 و 5 و 6 میده .

در صورتی که باید فقط شماره خط 4 رو بده .

اشکال کجاست !؟
دوست عزیز اگر دقت کنید شما messagebox را داخل حلقه گذاشتید که با هر بار اجرای حلقه مقدار counter به نمایش در میاد

NasimBamdad
دوشنبه 04 فروردین 1393, 10:41 صبح
دوست عزیز اگر دقت کنید شما messagebox را داخل حلقه گذاشتید که با هر بار اجرای حلقه مقدار counter به نمایش در میاد

درست می فرمایید . منم همین رو میگم .

abdullah20
دوشنبه 04 فروردین 1393, 10:44 صبح
try {
int counter = 1; string line;
System.IO.StreamReader file = new System.IO.StreamReader("test.txt");
while ((line = file.ReadLine()) != null)
{
if (line == "[/update]")
{
MessageBox.Show(Convert.ToString(counter));
}
counter++;
}
file.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

NasimBamdad
دوشنبه 04 فروردین 1393, 10:46 صبح
سلام
اگر شما یک فایل داشته باشید به شرح زیر

asad
asd
asdsadsa
sd
fff
aaa
hhhh
fdg
dfgdf
ddfgdf

و بخواهید شماره خطی را که متن آن aaa است را بدست بیاورید
آنگاه داریم :
string[] s= System.IO.File.ReadAllLines(@"C:\test.txt");
for (int i = 0; i < s.Length; i++)
{
if (s[i] == "aaa")
{
textBox1.Text = (i+1).ToString();
}
}

اگرهم میخوای بصورت تابع بنویسی که دوتا پارامتر میگیره اولی نام و ادرس فایل متنی و دومی هم ایتمی که میخوای شماره خطشو بگیری
public int GetLineNum(string fileNeme, string item)
{
int line_num = 0;
string[] s = System.IO.File.ReadAllLines(fileNeme);
for (int i = 0; i < s.Length; i++)
{
if (s[i] == item)
{
line_num = i + 1 ;
}
}
return line_num;
}
و برای فراخوانی تابع
textBox1.Text = GetLineNum(@"C:\test.txt", "aaa").ToString();

موفق باشید

ممنونم ، کد شما خیلی خیلی خوب جواب داد . خیلی لطف کردید

یه سوال دیگه . چه طوری میشه توی همون فایل بگیم که بین خط مثلا 4 و 5 یک خط ایجاد کن و یک متنی نوشته بهش ؟

مثلا مقداری که از تابع شما بدست اومده عدد 5 باشه . بگیم که یک خط قبل خط پنجم یک متنی نوشته بشه

NasimBamdad
دوشنبه 04 فروردین 1393, 10:54 صبح
درواقع باید این کار رو با آرایه انجام بدیم .

یعنی خونه 5ام به بعد رو یک خونه شیفت کنیم به سمت راست ، و یک خونه آزاد بشه :D

shahryari
دوشنبه 04 فروردین 1393, 11:33 صبح
درواقع باید این کار رو با آرایه انجام بدیم .

یعنی خونه 5ام به بعد رو یک خونه شیفت کنیم به سمت راست ، و یک خونه آزاد بشه :D
یه همچین چیزی به ذهنم رسید ببینید کار میکنه.....
public void AddLine(string fileNeme, int linNum ,string matn)
{

string[]s = System.IO.File.ReadAllLines(fileNeme);

if (linNum > s.Length)
{
MessageBox.Show("شماره خط نامعتبر است");
return;
}
string t = "";
for (int i = 0; i < s.Length; i++)
{
if (i == (linNum-1))
{
if (t == "")
{
t = matn;
}
else
{
t += "\r\n" + matn;
}

}
else
{
if (t == "")
{
t = s[i].ToString();
}
else
{
t += "\r\n" + s[i].ToString();
}

}
}

System.IO.File.WriteAllText(fileNeme, t);
}

نحوه فراخوانی:
AddLine(@"C:\test.txt", 6,"fffffffff");
پارامتر سوم متنی است که میخواهید قبل از شماره خط مورد نظر وارد کنید....
امیدوارم مطلب را رسانده باشم ....

veniz2008
دوشنبه 04 فروردین 1393, 12:15 عصر
چه طوری میشه توی همون فایل بگیم که بین خط مثلا 4 و 5 یک خط ایجاد کن و یک متنی نوشته بهش ؟

مثلا مقداری که از تابع شما بدست اومده عدد 5 باشه . بگیم که یک خط قبل خط پنجم یک متنی نوشته بشه
سلام.
اگر میخواید بر حسب شماره خط، یه عبارتی رو در بین فایل فعلی قرار بدید، می تونید فایل رو به دو بخش قبل از اون خط و بعد از اون خط تقسیم کنید.
حالا یه آرایه کمکی تعریف کنید که طولش یکی بیشتر از آرایه اولیه (فایل اولیه) هست و بخش اول رو با اندیس مشابه درون آرایه کمکی بریزید و بخش دوم رو هم با یک اندیس اختلاف درون آرایه کمکی بریزید (یک اندیس اختلاف بخاطر اون رکورد جدیدی هست که باید در آرایه کمکی اضافه بشه).
اون عبارت مورد نظر رو هم در بین بخش اول و دوم درج کنید.
این توضیحات رو می تونید در کد زیر مشاهده کنید .
این کد، یه عبارتی رو بین خطوط 3 و 4 درج میکنه. در حقیقت جای خط 4 (اندیس 3) رو میگیره و بقیه خطوط شیفت به راست پیدا میکنن. فرض میکنیم که شماره سطر درون یک متغیر int با نام line قرار داره :

StreamReader file = new StreamReader("d:\\Test.txt");
string AllText = file.ReadToEnd();
file.Close();
string[] Record = AllText.Split('\n');
string[] Temp = new string[Record.Length + 1];
for (int i = 0; i < line; i++)
{
Temp[i] = Record[i];
}
Temp[line] = "The C#‎‎‎‎‎‎‎‎ Language Specification is the definitive source for C#‎‎‎‎‎‎‎‎ syntax and usage";
for (int j = line + 1; j < Temp.Length; j++)
{
Temp[j] = Record[j - 1];
}
using (StreamWriter sw = new StreamWriter("d:\\Test.txt"))
{
foreach (string s in Temp)
{
sw.WriteLine(s);
}
}
موفق باشید.

NasimBamdad
سه شنبه 05 فروردین 1393, 01:26 صبح
یه همچین چیزی به ذهنم رسید ببینید کار میکنه.....
public void AddLine(string fileNeme, int linNum ,string matn)
{

string[]s = System.IO.File.ReadAllLines(fileNeme);

if (linNum > s.Length)
{
MessageBox.Show("شماره خط نامعتبر است");
return;
}
string t = "";
for (int i = 0; i < s.Length; i++)
{
if (i == (linNum-1))
{
if (t == "")
{
t = matn;
}
else
{
t += "\r\n" + matn;
}

}
else
{
if (t == "")
{
t = s[i].ToString();
}
else
{
t += "\r\n" + s[i].ToString();
}

}
}

System.IO.File.WriteAllText(fileNeme, t);
}

نحوه فراخوانی:
AddLine(@"C:\test.txt", 6,"fffffffff");
پارامتر سوم متنی است که میخواهید قبل از شماره خط مورد نظر وارد کنید....
امیدوارم مطلب را رسانده باشم ....

خیلی تابع خوبی هست . ببینید فقط یک تغییری بدید

وقتی مثلا در خط 6 ام ( که در این خط یک متن داریم ) از تابع شما استفاده کنیم ، در واقع میاد خط 6 ام رو با مطلب جدید آپدیت می کنه . یعنی متن خط 6 ام رو با متن جدید جایگزین می کنه .

چیزی که نیاز هست اینه که متن جدید رو در خط جدیدی بنویسه . مثلا وقتی می زنی خط 6 ام ، بیاد یک خط اضافه کنه و در خط 7 ام ( که موجود نیست ) متن رو اضافه کنه

ممنونم

NasimBamdad
سه شنبه 05 فروردین 1393, 18:29 عصر
خبری نبود؟