PDA

View Full Version : سوال: چگونگی خواندن اطلاعات از فایل (مهم)



black2
یک شنبه 24 خرداد 1388, 20:39 عصر
سلام خدمت همه دوستای عزیزم
روز زن رو هم تبریک میگم
یک فایل تکست دارم که این فایل به شمایل زیر است :

سلام خدمت همه دوستای عزیزم
روز زن رو هم تبریک میگم
یک فایل تکست دارم که این فایل به شمایل زیر است :
Calculation Succeeded,U1LSFG,76.7021,14.8487,2.83183,0,5.61738 ,57.4274,111927,-1,0,3000,0.852386,0.895542,1518.95,29686.7,177.032 ,1,14.8233,1340.8,0.890378,0.853716,13.8334,1545.4 ,4534.58,287.17,662.735,0.867065,12.8528,1340.8,77 8.174,12.4792,0.902105,1370.09,12.4792,45371,26450 ,10721.8,33.5764
Calculation Succeeded,U1LSFG,76.7021,14.8487,2.83183,0,5.61738 ,57.4303,111943,-1,15.3334,3000,0.852386,0.895541,1519.03,29688.3,1 77.032,1,14.8226,1340.76,0.890375,0.853794,13.8326 ,1545.48,4535.01,287.17,662.725,0.867063,12.8521,1 340.76,778.12,12.4785,0.902106,1370.05,12.4785,453 71,26450,10720.3,33.581

همینطور که ملاحظه می کنید مقادیر با کاما از هم جدا شده اند، این فایل توسط برنامه دیگری پر می شود و در هر ثانیه چند سطر افزوده می شود. من باید اطلاعات را از این فایل بخوانم و در برنامه درون تکست باکس های مشخص نمایش دهم. من به این صورت نوشتم

System.IO.StreamReader sr = System.IO.File.OpenText(@"C:\da.csv");
string[] values;
while (true)
{
string line = sr.ReadLine();
if (line == null) break;

values = line.Split(",".ToCharArray());
txtNetEff.Text = values[10].ToString();
txtFlow.Text = values[3].ToString();
}

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

tdkhakpur
یک شنبه 24 خرداد 1388, 21:07 عصر
سلام
خوب شما فایل رو بصورت تک کاربره باز کرده اید و امکان باز شدن مجدد رو نداده اید.
برای این کار به آپشن های مربوط به باز کردن فایل در دستورات باز کردن فایل یک نگاهی بندازید.

black2
یک شنبه 24 خرداد 1388, 23:10 عصر
سلام
خوب شما فایل رو بصورت تک کاربره باز کرده اید و امکان باز شدن مجدد رو نداده اید.
برای این کار به آپشن های مربوط به باز کردن فایل در دستورات باز کردن فایل یک نگاهی بندازید.
مرسی خوب من میخوام فایل رو خط به خط بخونم (readline) تابع دیگری پیدا نکردم که این کار رو هم برام انجام بده!
چون اطلاعات 10 سطر آخر رو احتیاج دارم
ممنون میشم بیشتر راهنمایی کنید

black2
سه شنبه 26 خرداد 1388, 01:05 صبح
کد رو به صورت زیر تغییر دادم

FileStream FS = new FileStream(@"c:\da.csv", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS);



اطفا به این سوال جواب بدید اطلاعات 10 سطر آخر رو چجوری دخیره کنم
بهینه ترین راه که به نظرتون میرسه چیه؟

Reza_Yarahmadi
سه شنبه 26 خرداد 1388, 12:50 عصر
یه راه ساده اینه که کل فایل رو بخونی بعد 10 سطر آخرش رو جدا کنی و ازش استفاده کنی


FileStream FS = new FileStream(@"c:\da.csv", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS, Encoding.Default);
string AllText = SR.ReadToEnd();
string[] AllLines = AllText.Split('\n');
for (int i = AllLines.Length - 10; i < AllLines.Length; i++)
{
//Your Commands
}

black2
چهارشنبه 27 خرداد 1388, 11:49 صبح
یه راه ساده اینه که کل فایل رو بخونی بعد 10 سطر آخرش رو جدا کنی و ازش استفاده کنی


FileStream FS = new FileStream(@"c:\da.csv", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS, Encoding.Default);
string AllText = SR.ReadToEnd();
string[] AllLines = AllText.Split('\n');
for (int i = AllLines.Length - 10; i < AllLines.Length; i++)
{
//Your Commands
}


مرسی واب اینجوری در هر خانه آزایه alllines یک خط دخیره میشود و من میخوام که مشلا از سطر آخر 5 مقدار مشخص را نمایش دهم اطفا نمونه بالا رو ببنید و راهنمایی کنید

Reza_Yarahmadi
چهارشنبه 27 خرداد 1388, 13:04 عصر
خب چون مقدارها با "," از هم جدا شده میتونی برای هر خط دوباره از تابع Split استفاده کنی و ...


for (int i = AllLines.Length - 10; i < AllLines.Length; i++)
{
string[] LineValues = AllLines[i].Split(",");
txtNetEff.Text = LineValues[10];
txtFlow.Text = LineValues[3];
//Your Commands
}

black2
چهارشنبه 27 خرداد 1388, 15:33 عصر
خب چون مقدارها با "," از هم جدا شده میتونی برای هر خط دوباره از تابع Split استفاده کنی و ...


for (int i = AllLines.Length - 10; i < AllLines.Length; i++)
{
string[] LineValues = AllLines[i].Split(",");
txtNetEff.Text = LineValues[10];
txtFlow.Text = LineValues[3];
//Your Commands
}


از راهنمایی های شما ،خیلی ممنونم دوست عزیز ! با در نظر گرفتن اینکه تعداد خطوط در حال افزایش است آیا این روش نوشتن باعث کند شدن بیش از حد برنامه نمی شود!

NewFoxStudent
چهارشنبه 27 خرداد 1388, 16:26 عصر
ممکنه بفرمایید نوع فایلتون چیه و مقادیری که در هر خط نوشته میشه برابرن یا متغیر

black2
چهارشنبه 27 خرداد 1388, 18:23 عصر
ممکنه بفرمایید نوع فایلتون چیه و مقادیری که در هر خط نوشته میشه برابرن یا متغیر

نوع فایل csv است که شمایل آن هم بطورت زیر :

Calculation Succeeded,U1LSFG,76.7021,14.8487,2.83183,0,5.61738 ,58.8822,108769,19.4,-0.958813,3000.88,0.852323,0.895469,1524.26,29794.1 ,177.084,1.00029,14.7882,1324.99,0.890381,0.853637 ,13.796,1550.15,4534.49,287.17,662.312,0.866957,12 .8207,1324.99,768.475,12.4437,0.90198,1353.67,12.4 437,45371,25886.6,10798.1,33.3391
Calculation Succeeded,U1LSFG,76.7021,14.8487,2.83183,0,5.61738 ,58.8793,108769,19.5,0.642713,3000.54,0.852329,0.8 95473,1524.18,29792.6,177.064,1.00018,14.7875,1325 .01,0.890381,0.853638,13.7955,1550.07,4534.49,287. 17,662.301,0.866958,12.8202,1325.01,768.493,12.443 2,0.901978,1353.7,12.4432,45371,25886.6,10798.1,33 .3393

مقادیر در هر سطر ثابت نیست و می توان گفت متغیرند، در پست اولم کامل توضیح دادم

black2
چهارشنبه 27 خرداد 1388, 18:49 عصر
این مشکلم هم هنوز حل نشده!! لطفا راهنمایی کنید

NewFoxStudent
چهارشنبه 27 خرداد 1388, 18:57 عصر
ببینید اگه تعداد حروف هر ستون در هر سطر ثابت باشه که توی نمونه ای که گذاشتید همینطوری هست
میتونید از حجم فایل استفاده کنید برای این که بفهمید چند سطر به فایل اضافه شده و بعد همون چند سطر انتهای فایل رو بخونید
اینطوری سرعت برنامه خیلی بالاتر میره

Reza_Yarahmadi
چهارشنبه 27 خرداد 1388, 20:19 عصر
از راهنمایی های شما ،خیلی ممنونم دوست عزیز ! با در نظر گرفتن اینکه تعداد خطوط در حال افزایش است آیا این روش نوشتن باعث کند شدن بیش از حد برنامه نمی شود!
همونطور که دوستمون گفتند اگر اندازه هر سطر و مکان هر داده ثابت باشه میتونید اشاره گر فایل رو به نقطه مورد نظر ببرید و فقط داده دلخواه رو بخونید ولی اگر اندازه ها متغیره فکر کنم این روش سرعت بهتری داشته باشه چون فقط یکبار عمل خوندن از فایل انجام میشه و سرعت پردازش اطلاعات داخل رم خیلی بیشتر از خوندن و نوشتن در فایله.

Reza_Yarahmadi
چهارشنبه 27 خرداد 1388, 20:31 عصر
در مورد مشکل Used by another process
اگر در بار اول خوندن از فایل مشکلی نیست و در بارهای بعدی مشکل به وجود میاد ، مربوط به اینه که توی بلاکی که شما از فایل میخونید باید در انتهای اون FileStream و StreamReader رو ببندید ولی اگر در همون بار اول هم مشکل هست مربوط به برنامه ایه که توی فایل مینویسه. گمون نمیکنم بشه کاری واسش کرد مگر اینکه برنامه رو یک لحظه از رم خارج کنید (ببندید) و فایل رو بخونید بعد دوباره برنامه رو طبق آدرسش Run کنید.
(البته مطمئنا اساتید این سایت میتونند کمکتون کنند سؤالی نیست که اینجا جوابی واسش نباشه!! :چشمک: )

black2
پنج شنبه 28 خرداد 1388, 00:19 صبح
ببینید اگه تعداد حروف هر ستون در هر سطر ثابت باشه که توی نمونه ای که گذاشتید همینطوری هست
میتونید از حجم فایل استفاده کنید برای این که بفهمید چند سطر به فایل اضافه شده و بعد همون چند سطر انتهای فایل رو بخونید
اینطوری سرعت برنامه خیلی بالاتر میره

فکر میکنم که همینطور باشه تعداد حروف ثابت هستند
اگر ممکنه کمی بیشتر راهنمایی کنید،

black2
پنج شنبه 28 خرداد 1388, 00:23 صبح
[QUOTE=Reza_Yarahmadi;741261]در مورد مشکل Used by another process
اگر در بار اول خوندن از فایل مشکلی نیست و در بارهای بعدی مشکل به وجود میاد QUOTE]

دوست عزیز از همان بار اول باز شدن برنامه این مشکل وجود داره.نمیدونم دلیلش چیه؟ و چیکار میشه کرد؟

NewFoxStudent
پنج شنبه 28 خرداد 1388, 10:19 صبح
میتونید برای بار اول که فایل رو باز میکنید سایزش رو یه جا ذخیره کنید و توی یه حلقه بدون توقف سایز فایل رو با مقدار ذخیره شده مقایسه کنید اگه اختلاف به اندازه یک خط از داده ها بود عملیات مورد نظر رو انجام بدید.

black2
سه شنبه 02 تیر 1388, 21:50 عصر
used by another proccess

سلام بچه ها کسی راه حلی برای این مشکل من به نطرش نرسید؟

black2
سه شنبه 02 تیر 1388, 21:53 عصر
میتونید برای بار اول که فایل رو باز میکنید سایزش رو یه جا ذخیره کنید و توی یه حلقه بدون توقف سایز فایل رو با مقدار ذخیره شده مقایسه کنید اگه اختلاف به اندازه یک خط از داده ها بود عملیات مورد نظر رو انجام بدید.


ممنون دوست عزیز الگوریتم جالبی پیشنهاد کردید عملی کردم بد نشد ، ولی باز هم با فایل همان مشکل proccess by another user را دارم نمیدونم چیکار کنم
فکر میکنم باید سورس برنامه ای که فایل را می سازد و پر می کند را ببینم و آنرا دچار تغییرات بکنم!

Reza_Yarahmadi
سه شنبه 02 تیر 1388, 22:45 عصر
اگر به سورس برنامه ای که فایل رو میسازه دسترسی دارید فقط کافیه Stream ی که توی فایل مینویسه رو تغییر بدی بطوریکه به سایر Streamها اجازه بده از فایل بخونن.
ولی اگر برنامه نویسنده قابلیت ویرایش نداره میتونی از کلاس Process استفاده کنی و برنامه نویسنده رو از رم خارج کنی (ببندی) بعد از فایل بخونی و دوباره برنامه نویسنده رو اجرا کنی. برای توضیحات بیشتر در رابطه با این کلاس توی سایت جستجو کن مطالب زیادی در این مورد پیدا میکنی.

black2
شنبه 13 تیر 1388, 23:50 عصر
سلام
اساتید این مشکل من با خواندن از فایل در نهایت حل نشد.
طریقه خواندن از فایل همانطور که قبلا گفتم اینجوری نوشتم

FileStream FS = new FileStream("@c:\da.csv", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS, Encoding.Default);
string AllText = SR.ReadToEnd();


چون فایل قبلا توسط برنامه دیگری باز شده و در آن اطلاعات نوشته میشود ارور ران تایم میده

It being used by another process

حالا نمیدونم چطور این مشکل را رفع کنم، دوستان گفتند که نمیشه کاری کرد اگه اینطور فرض کنیم پس وقتی برنامه اصلی فایل را باز کرده و مشغول ثبت اطلاعات در آن است و فایل را با برنامه اکسل باز میکنم به راحتی فایل در حالت فقط خواندنی باز میشود .این طرز کار اکسل من رو دچار تناقض کرد لطفا راهنمایی بفرمایید

black2
سه شنبه 16 تیر 1388, 10:55 صبح
اساتید کمکی از دست کسی بر نمی آید !! لطفا راهنمایی بفرمایید

black2
چهارشنبه 17 تیر 1388, 00:02 صبح
با عرض سلام مجدد خدمت همه دوستان عزیز ، بنده روی این مشکل بسیاز وقت گذاشتم و کار کردم در نهایت هم به نتیجه قابل قبولی نرسیدم و نتوانستم خودم را راضی کنم
ولی تونستم با یک ترفند ساده مشکلم را حل کنم ولی این به هیج وجه راه حل اصلا نیست و اطمینان دارم راه بهتر و منطقی برای حل این مشکل هست!

string strFileName2 = strFile + "temp";
File.Copy(strFile, strFileName2);


تونستم مشکلم را حل کنم، گفتم اینجا اعلام کنم شاید به درد کسان دیگری هم خورد!
البته دوستان که بنده رو قابل نمیدونن و جوابی به پست هایم نمیدن معمولا...
یا علی

adinochestva
چهارشنبه 17 تیر 1388, 00:42 صبح
برنامه ای که در حال نوشتن هست فایل رو شیر نکرده والا من هم با کدی مثل کد شما وقتی فایل درحین نوشتن بود در یک برنامه دیگر . فایل رو می خواندم

mzalireza
چهارشنبه 17 تیر 1388, 22:29 عصر
سلام بچه ها کسی راه حلی برای این مشکل من به نطرش نرسید؟

از دستور using استفاده کرده ای؟



using(StreamReader SR = new StreamReader(FS, Encoding.Default))
{
// your Code
}




البته بیشتر نظرم رو قسمت نوشتن فایل هستش. چونکه اون نمیذاره برای خوندن فایل بهش دسترسی داشته باشی.
در هر صورت بهتره که هم برای "خوندن" هم برای "نوشتن" از دستور بسیار مفید using که برای آزادسازی منبع که در اینجا فایلهای txt. ماهست، استفاده کنی.

black2
چهارشنبه 17 تیر 1388, 23:54 عصر
از دستور using استفاده کرده ای؟



using(StreamReader SR = new StreamReader(FS, Encoding.Default))
{
// your Code
}




البته بیشتر نظرم رو قسمت نوشتن فایل هستش. چونکه اون نمیذاره برای خوندن فایل بهش دسترسی داشته باشی.
در هر صورت بهتره که هم برای "خوندن" هم برای "نوشتن" از دستور بسیار مفید using که برای آزادسازی منبع که در اینجا فایلهای txt. ماهست، استفاده کنی.

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

black2
چهارشنبه 17 تیر 1388, 23:59 عصر
برنامه ای که در حال نوشتن هست فایل رو شیر نکرده والا من هم با کدی مثل کد شما وقتی فایل درحین نوشتن بود در یک برنامه دیگر . فایل رو می خواندم

بله برنامه نویسنده فایل رو شیر نکرده است ، این درسته! ولی با همین حال هم Excel این فایل رو باز میکنه و تغییرات را کاملا نمایش میدهد این مرا دچار تناقض کرد ... که اگر نمیشود پس اکسل چطور این کار را میکند!