-
حذف یک خط از فایل text
با سلام
دوستان من خط های یه فایل text رو میخونم و میریزم دا خل یه ارایه برای مثال می خوام چهارمین خط رو پاک کنم زمانی که ارایه شماره چهار رو مساوی "" قرار می دم و بعد ارایه رو داخل فایل text سیو می کنم اون خط پاک میشه ولی مشکلی که دارم اینه که اطلاعات زیرین یک خط به بالا نمیان و در داخل فایلم همه ای اطلاعت سر جای خودشون هستند و فقط خط چهارم هیچ اطلاعتی نداره در صورتی که من میخوام اطلاعات خط پنجم بیاد جای خط چهارم بشینه و خط ششم بیاد جای پنجم و به همین ترتیب مرتب بشه
لطفا راهنمایی کنید چیکار باید بکنم مرسی "سی شارپ"
-
من سه روش در ذهن دارم:
1- خواندن کل فایل در رم و سپس ایجاد تغییرات در آن و رایت مجدد اطلاعات
2- خواندن خطی و ایجاد تغییرات خطی.
3- روش ترکیبی
اگر حجم فایل کم باشد روش اول مناسب است. به این کد دقت کنید:
کد:
System.IO.StreamReader sr = new System.IO.StreamReader("C:\\AAA.txt");
List<string> lines = new List<string>();
while (!sr.EndOfStream)
{
lines.Add(sr.ReadLine());
}
//this is better to use:(higher speed)
//lines.AddRange(sr.ReadToEnd().Split('\n'));
sr.Close();
lines.RemoveAt(2);
System.IO.StreamWriter srw = new System.IO.StreamWriter("c:\\AAA.txt", false);
for(int i=0;i<lines.Count;i++)
srw.WriteLine(lines[i]);
srw.Close();
اگر حجم فایل بالای 100 مگ باشد پیشنهاد نمی گردد. البته این کاملا بسته به تعریف شما از سخت افزار مورد نیاز دارد.
روش دوم: روش بسیار کند می باشد اما گر در فایل هایی با حجم کم و بسیار کم استفاده شود تغییر محسوسی ندارد. به این کد دقت کنید:
کد:
System.IO.StreamReader sr = new System.IO.StreamReader("C:\\AAA.txt");
System.IO.StreamWriter srw = new System.IO.StreamWriter(System.IO.Path.GetTempPath()+"\\tempAAA.tmp",false);
int lineCount = 0;
while (!sr.EndOfStream)
{
if (++lineCount != 2)
srw.WriteLine(sr.ReadLine());
else
sr.ReadLine();
}
sr.Close();
srw.Close();
System.IO.File.Copy(System.IO.Path.GetTempPath() + "\\tempAAA.tmp", "C:\\AAA.txt", true);
System.IO.File.Delete(System.IO.Path.GetTempPath() + "\\tempAAA.tmp");
در واقع ما اطلاعات رو در یک temp ذخیره می کنیم و در نهایت فایل temp را روی فایل اصلی می گذاریم. مشاهده این رفتار را در Word دیده اید. البته لازم به ذکر است که Word یک روند طولانی در ذخیره سازی دارد یعنی کاربر ساعت ها پای Word هست برای همین هم این روش استفاده از temp مناسب جلوه می کند.
روش سوم برای حجم های بالاست که سرعت مناسبی خواهد داشت. بدین ترتیب که روش اول و دوم را ترکیب کنید. یعنی مثلا 100 مگ بخوانید و تغییر بدهید و آنگاه رایت کنید و مجددا این عمل را انجام دهید تا به انتهای فایل برسید.
موفق باشید.
-
دوست عزیز ضمن تشکر از زحمات خالصانه جنابعالی . اگه واستون امکانش مقدوره واسه هر خط یه توضیح کوچولو بده .
صمیمانه سپاسگذارم
-
کدام روش رو؟ :n24:
:n02:
---------------------------------------------
روش اول:
کد:
while (!sr.EndOfStream)
{
lines.Add(sr.ReadLine());
}
این قسمت در یک لیست تمام خط ها رو قرار می ده.
این کد هم همین کار رو می کنه:
کد:
//this is better to use:(higher speed)
//lines.AddRange(sr.ReadToEnd().Split('\n'));
در این خط من خط سوم آون فایل متنی رو که خوندم رو پاک می کنم:
در ادامه هم هرچی در لیستم دارم رو می ریزم در فایل و حالا چون خط سوم رو نداره تفاوت این فایل با قبلی مشخص می شه و خط سوم حذف گردیده است.
کد:
System.IO.StreamWriter srw = new System.IO.StreamWriter("c:\\AAA.txt", false);
for(int i=0;i<lines.Count;i++)
srw.WriteLine(lines[i]);
srw.Close();
--------------------------------------------------------------------------------------
روش دوم:
در این بخش:
کد:
while (!sr.EndOfStream)
{
if (++lineCount != 2)
srw.WriteLine(sr.ReadLine());
else
sr.ReadLine();
}
تا آخر فایل خط به خط می خونم و سپس هر خطی رو که
به غیر از خط سوم باشه رو در فایل Temp ذخیره می کنم
else رو هم برای این می گذارم که position فایل رو یک خط ببرم جلو.
در آخر هم فایل Temp رو روی فایل اصلی قرار می دهم و فایل Temp رو هم پاک می کنم.
روش سوم:
OPS ، روش سوم که کد نداره:n02:
موفق باشید.