نمایش نتایج 1 تا 14 از 14

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

  1. #1

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

    سلام دوستان
    یک فایل از نوع 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();
    }
    }
    }

  2. #2
    خطها رو با یه استاندارد خاص بنویس و با همون استاندارد تو شرط چک کن.
    تمام کدهای خطا اگه 4 رقمی باشند، میتونی بذاریشون اول خط و تو شرط یک استرینگ به طول 4تا از line برداری و ببینی چه کدی هست

  3. #3
    متاسفانه از کدهای خطا یکی یک رقمی هست 0="OK" .شاید هم بخوایم سایزشون متفاوت باشه .اینو نمیشمه کاریش کرد؟؟

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

  5. #5
    خیلی راحتر از این حرفا میشه این کار رو کرد
    اول توی فایل کافیه شماره ها پیام ها وغیره رو با یک کاراکتری جدا کرده باشید ، مثلا همین مساوی که گذاشتید.

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

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

    https://barnamenevis.org/showth...ighlight=Split
    https://barnamenevis.org/showth...ighlight=Split

  6. #6
    بازم سلام.بابت راهنمایی هاتون ممنون. خیلی کمکم کرد.کدی که نوشتم به صورت زیر است
      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 بود برنامه آنرا نادیده بگیرد.
    روشهای مختلف رو امتحان کردم اما نشد .چه تغییری باید در کدم بدم؟

  7. #7
    نقل قول نوشته شده توسط sara.pazhrang مشاهده تاپیک
    بازم سلام.بابت راهنمایی هاتون ممنون. خیلی کمکم کرد.کدی که نوشتم به صورت زیر است
      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 هاست.

  8. #8
    while (line != null)

    به این:
    while (line != null && line.indexOf("//")>0)

  9. #9
    //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.

  10. #10
    یه اشتباه لپی بود
    while (line != null && line.indexOf("//")!=0)


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

  11. #11
    mehdi کاملا درست گفته راه های دیکه خیلی غیر اصو لیه Regex را در msdn مرور کن
    بهترین راه همینه در اصل یک پترن برای این کار نیاز داری

  12. #12

    Thumbs up

    نقل قول نوشته شده توسط sara.pazhrang مشاهده تاپیک
    //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.*)\\x2 2";
    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 های برنامه باید اضافه کنید.

  13. #13
    با سلام دوباره.با راهنمایی دوستان من وارد دنیای 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.*?<Pa rameter>(\\x22\\x24\\x28\\d.*\\x29\\x22)\\w.*))\\x 22";


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

  14. #14
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491

    (?<ErrorCode>[-|+].\\d*)\\s*=\\s*\"(?<ErrorDesc>[\\w|\\s|\\W|\\d]+\"\\x24\\x28\\d\\x29\"[\\w|\\s|\\W|\\d]+)\"

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •