PDA

View Full Version : خواندن همراه یک شرط از فایل txt



sara.pazhrang
یک شنبه 14 مرداد 1386, 10:45 صبح
سلام دوستان
یک فایل از نوع txt دارم که در هر خط آن یک errorCode مساوی با پیغام خطای آن نوشته شده مثلا -1000="one Error"
حالا در برنامه یک تابع دارم که به آن تابع یک مقدار int می دهیم و آن تابع در فایل می گردد و اگر مقداری برابر با آن int در فایل txt پیدا کرد رشته خطا مطابق با آن شماره رو برگرداند.
نمی دونم آیا متوجه سوالم شدین یا نه.مشکل من اینه که چه دستور شرطی برای اینکار بذارم ؟؟؟؟؟؟؟؟
کدهای خواندن از فایل را تا یه جایی نوشتم.

public static string decodeError(int i__Error)
{
Stream myStream;

// string txtPath = Application.StartupPath + "\\ERROR_CODE.txt";
OpenFileDialog openTXTfile = new OpenFileDialog();
openTXTfile.InitialDirectory = Application.StartupPath + "\\ERROR_CODE.txt";
openTXTfile.RestoreDirectory = true;
if ((openTXTfile.ShowDialog() == DialogResult.OK))
{
if ((myStream = openTXTfile.OpenFile()) != null)
{
try
{
using (StreamReader sr = new StreamReader(myStream))
{
String line;
while ((line = sr.ReadLine()) != null)
{
if (line؟؟؟؟ System.Convert.ToString(i__Error))
return (؟؟؟؟);
}
}
}
catch (Exception err)
{
// Let the user know what went wrong.
MessageBox.Show(err.Message);
}
myStream.Close();
}
}
}

once4ever
یک شنبه 14 مرداد 1386, 11:04 صبح
خطها رو با یه استاندارد خاص بنویس و با همون استاندارد تو شرط چک کن.
تمام کدهای خطا اگه 4 رقمی باشند، میتونی بذاریشون اول خط و تو شرط یک استرینگ به طول 4تا از line برداری و ببینی چه کدی هست

sara.pazhrang
یک شنبه 14 مرداد 1386, 11:20 صبح
متاسفانه از کدهای خطا یکی یک رقمی هست 0="OK" .شاید هم بخوایم سایزشون متفاوت باشه .اینو نمیشمه کاریش کرد؟؟

sara.pazhrang
یک شنبه 14 مرداد 1386, 11:39 صبح
1)

تمام کدهای خطا اگه 4 رقمی باشند، میتونی بذاریشون اول خط و تو شرط یک استرینگ به طول 4تا از line برداری و ببینی چه کدی هست
میشه برام کدی رو بنویسید که از رشته Line تا 4 کرکتر رو بخونه؟:خجالت:
2)
به فرض که کدی مطابق با عدد مورد پیدا کرد ، بعد از 4 تا کرکتر 5 که = هست باید کدی بنویسیم که از کارکتر 6 تا آخر همان line را بخواند و برگرداند(اینم نمیدونم چه جوریه)

Alireza_Salehi
یک شنبه 14 مرداد 1386, 13:03 عصر
خیلی راحتر از این حرفا میشه این کار رو کرد
اول توی فایل کافیه شماره ها پیام ها وغیره رو با یک کاراکتری جدا کرده باشید ، مثلا همین مساوی که گذاشتید.

بعد با متد Readline خط به خط فایل رو بخونید و بعدش با متد split کلاس String قسمت های مختلف رو جدا کنید بعدش هم فقط یک تبدیل String به Integer دارید با متد Parse یا Convert !

جستجو کنید قبلا مثال زدم.

http://barnamenevis.org/forum/showthread.php?t=65072&highlight=Split
http://barnamenevis.org/forum/showthread.php?t=64362&highlight=Split

sara.pazhrang
سه شنبه 16 مرداد 1386, 11:21 صبح
بازم سلام.بابت راهنمایی هاتون ممنون. خیلی کمکم کرد.کدی که نوشتم به صورت زیر است

public static string decodeProcedure(int i_Error)
{
string txtPath = Application.StartupPath + "\\ERROR_CODE.txt";
TextReader t_textReader = File.OpenText(txtPath);
string sep = "=";

char[] seperator = sep.ToCharArray();
string line;
string[] columnSplit = null;
line=t_textReader.ReadLine();

while (line != null)
{
columnSplit = line.Split(seperator);

if (System.Convert.ToInt32(columnSplit[0]) == i_Error)
return (columnSplit[1]);
line = t_textReader.ReadLine();

}
return (" “No Corresponding Error defined!” ");
}

مشکلی که الان دارم اینه که اگه در اون فایل متنی یک comment توسط // بگذاریم error میده.یعنی من میخوام علاوه بر داده هایی مثل 1000="ok" یا -1001="no" و ... قسمت توضیحات در آن فایل متنی داشته باشم مثلا error list// .و اگه خطی شامل این comment بود برنامه آنرا نادیده بگیرد.
روشهای مختلف رو امتحان کردم اما نشد .چه تغییری باید در کدم بدم؟

mehdi.mousavi
سه شنبه 16 مرداد 1386, 12:56 عصر
بازم سلام.بابت راهنمایی هاتون ممنون. خیلی کمکم کرد.کدی که نوشتم به صورت زیر است

public static string decodeProcedure(int i_Error)
{
string txtPath = Application.StartupPath + "\\ERROR_CODE.txt";
TextReader t_textReader = File.OpenText(txtPath);
string sep = "=";

char[] seperator = sep.ToCharArray();
string line;
string[] columnSplit = null;
line=t_textReader.ReadLine();

while (line != null)
{
columnSplit = line.Split(seperator);

if (System.Convert.ToInt32(columnSplit[0]) == i_Error)
return (columnSplit[1]);
line = t_textReader.ReadLine();

}
return (" “No Corresponding Error defined!” ");
}
مشکلی که الان دارم اینه که اگه در اون فایل متنی یک comment توسط // بگذاریم error میده.یعنی من میخوام علاوه بر داده هایی مثل 1000="ok" یا -1001="no" و ... قسمت توضیحات در آن فایل متنی داشته باشم مثلا error list// .و اگه خطی شامل این comment بود برنامه آنرا نادیده بگیرد.
روشهای مختلف رو امتحان کردم اما نشد .چه تغییری باید در کدم بدم؟


سلام.
لطفا چند خط از فایل Text خودتون رو اینجا بذارید. سپس بفرمایید که دقیقا به چه بخشهایی از هر خط نیاز دارید تا بگم دقیقا چیکار کنید. روشهای پیشنهاد شده علیرغم اینکه کار میکنن، اما برای چنین کارهایی کارآمد نیستن. بهترین روش برای اینجور کارها استفاده از Regular Expression هاست.

once4ever
سه شنبه 16 مرداد 1386, 13:01 عصر
while (line != null)
به این:

while (line != null && line.indexOf("//")>0)

sara.pazhrang
سه شنبه 16 مرداد 1386, 13:05 عصر
//error codes
//kostia
0="Kostia OK"
-1000="Kostia Error"
-1001="Kostia No Init!"
-1002="Kostia Conversion Error!"
-1003="Kostia CAN Write Error!"
-1004="Kostia CAN Read Error!"





text after // will be ignored(comment)
white space will be egnored
<integer>=<error msg>
the error message string is quoted by quotation marks.
return the string corresponding to the error code integer.

once4ever
سه شنبه 16 مرداد 1386, 13:26 عصر
یه اشتباه لپی بود

while (line != null && line.indexOf("//")!=0)

پیشنهاد: یکم خودتون بیشتر رو خطاهایی که پیش میاد کار کنید که این محدودیت گذاشتن باعث میشه درآینده کمتر به راهنمایی نیاز داشته باشید.

rasoul_ras
سه شنبه 16 مرداد 1386, 13:43 عصر
mehdi کاملا درست گفته راه های دیکه خیلی غیر اصو لیه Regex را در msdn مرور کن
بهترین راه همینه در اصل یک پترن برای این کار نیاز داری

mehdi.mousavi
سه شنبه 16 مرداد 1386, 20:53 عصر
//error codes
//kostia
0="Kostia OK"
-1000="Kostia Error"
-1001="Kostia No Init!"
-1002="Kostia Conversion Error!"
-1003="Kostia CAN Write Error!"
-1004="Kostia CAN Read Error!"

text after // will be ignored(comment)
white space will be egnored
<integer>=<error msg>
the error message string is quoted by quotation marks.
return the string corresponding to the error code integer.


سلام.
همونطور که گفته بودم (و الان کدش رو هم براتون میذارم)، بهترین روش برای چنین کارهایی استفاده از Regular Expression هاست. ابتدا تابع زیر و به برنامه اتون اضافه کنید:


private Boolean ExtractErrorInfo(String line, out Int32 errorCode, out String errorDesc)
{
errorCode = -1;
errorDesc = null;

String pattern = "^(?<ErrorCode>(-\\d.*|\\d.*))\\s*=\\s*\\x22(?<ErrorDesc>\\w.*)\\x22";
Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.ExplicitCapture);
Match match = regex.Match(line);
if (!match.Success || match.Groups.Count != 3)
return false;

errorCode = Convert.ToInt32(match.Groups["ErrorCode"].Value.Trim());
errorDesc = match.Groups["ErrorDesc"].Value.Trim();
return true;
}

حالا توی لوپی که خط به خط دارید فایل رو می خونید، هر خط رو به این تابع بدید و دو مقدار errorCode و errorDesc رو که به ترتیب از نوع Int32 و String هستن رو ازش بگیرید. تو این تابع من Whitespace ها رو هم در نظر گرفتم، یعنی اگر خطی بصورت



-1001 = "Kostia No Init!"هم وارد شده باشه، اطلاعاتش درست extract میشه. Comment ها هم نادیده گرفته میشن. فراموش نکنید که System.Text.RegularExpressions رو هم به namespace های برنامه باید اضافه کنید.

sara.pazhrang
پنج شنبه 01 شهریور 1386, 11:57 صبح
با سلام دوباره.با راهنمایی دوستان من وارد دنیای Regular Expressions شدم و تونستم معادلی برای مطابقت با نوشته های بالا در regex ها پیدا کنم:

(?<ErrorCode>(-\d.*|\d.*))\s*=\s*\x22(?<ErrorDesc>\w.*)\x22
که می تونه رشته های زیر را پیدا کنه

//error codes
//kostia
0="Kostia OK"
-1000="Kostia Error"
-1001="Kostia No Init!"
اما مشکل جدید من اینه که می خوام معادلی برای رشته زیر با عبارات منظم بنویسم

-4001="The data type for "$(1)" is of wrong type!"

البته می خوام برنامه مقدار"(1)$" را بعد از پیدا کردن با چیزی مثل aa پر کند ...خیلی جستجو و searc کردم تا جایی هم کدش رو نوشتم

String pattern =
"(?<ErrorCode>(-\\d.*|\\d.*))\\s*=\\s*\\x22(?<ErrorDesc>(\\w.*?<Parameter>(\\x22\\x24\\x28\\d.*\\x29\\x22)\\w.*))\\x22";

همینطور یک برنامه دانلود کردم که براتون میذارم.کار این برنامه اینه که یک عبارت منظم بهش میدی و رشته هاتو هم بهش میدی بعد با اجرای آن مشخص می کنه که آیا این عبارت در رشته هات وجود داره یا نه و نتیجه رو برمی گردونه

PC2st
پنج شنبه 01 شهریور 1386, 14:50 عصر
(?<ErrorCode>[-|+].\\d*)\\s*=\\s*\"(?<ErrorDesc>[\\w|\\s|\\W|\\d]+\"\\x24\\x28\\d\\x29\"[\\w|\\s|\\W|\\d]+)\ (file://x24//x28//d//x29/%22%5B//w%7C//s%7C//W%7C//d%5D+)/)"