سؤال

أريد أن تحليل الملف config شيء على شيء مثل ذلك:

[KEY:Value]     
    [SUBKEY:SubValue]

الآن بدأت مع StreamReader, تحويل الخطوط إلى حرف المصفوفات ، عندما فكرت يجب أن يكون هناك طريقة أفضل.لذلك أنا أسألك المتواضع القارئ ، أن تساعد لي.

وتقييد واحد هو أن لديها للعمل في لينكس/أحادية البيئة (1.2.6 على وجه الدقة).أنا لم يكن لديك أحدث من الإصدار 2.0 (أحادية) ، وذلك في محاولة لتقييد ميزات اللغة C# 2.0 أو C# 1.0.

هل كانت مفيدة؟

المحلول

لقد فكرت في ذلك ولكن أنا لا أذهب إلى استخدام XML.أنا ذاهب إلى كتابة هذه الاشياء من جهة ، و من جهة تحرير XML يجعل عقلي يضر.:')

هل نظرت في YAML?

يمكنك الحصول على فوائد XML دون كل الألم والمعاناة.انها تستخدم على نطاق واسع في روبي المجتمع لأشياء مثل ملفات التكوين ، قبل إعداد قاعدة البيانات ، إلخ

هنا مثال

customer:
  name: Orion
  age: 26
  addresses:
    - type: Work
      number: 12
      street: Bob Street
    - type: Home
      number: 15
      street: Secret Road

يبدو أن هناك C# مكتبة هنا, التي لم تستخدم شخصيا ، ولكن yaml هو بسيط جدا ، لذلك "مدى صعوبة يمكن أن يكون؟" :-)

أود أن أقول أنه من الأفضل اختراع الخاصة بك المخصصة شكل (والتعامل مع محلل البق)

نصائح أخرى

كنت أبحث في تقريبا هذه المشكلة بالضبط في اليوم الآخر: هذه المادة على سلسلة tokenizing هو بالضبط ما تحتاجه.سوف تحتاج إلى تحديد الرموز شيئا مثل:

@"(?&ltlevel>\s) | " +
@"(?&ltterm>[^:\s]) | " +
@"(?&ltseparator>:)"

المادة يقوم بعمل جيد جدا من شرح ذلك.من هناك تبدأ تلتهم الرموز على النحو الذي تراه مناسبا.

بروتيب:على LL(1) محلل (قراءة:سهلة), الرموز لا يمكن مشاركة بادئة.إذا كان لديك abc كعربون ، لا يمكن أن يكون ace كعربون

ملاحظة:المقال يفتقد | الشخصيات في الأمثلة مجرد رمي لهم في.

هناك آخر YAML المكتبة .صافي التي هي قيد التطوير.الآن يدعم القراءة YAML تيارات وقد تم اختباره على ويندوز أحادية.إرسال الدعم يجري تنفيذه حاليا.

باستخدام مكتبة دائما تقريبا ويفضل أن المتداول الخاصة بك.وهنا لائحة سريعة من "يا أنا لن تحتاج أن/لم أفكر أن" النقاط التي سوف تنتهي إلى لدغة لك في وقت لاحق إلى أسفل الخط:

  • الهروب من الشخصيات.ما إذا كنت ترغب في :في مفتاح أو ] في القيمة ؟
  • الهروب من الحرف.
  • Unicode
  • مزيج من علامات التبويب و المساحات (انظر المشاكل مع بايثون المساحة البيضاء الحساسة الجملة)
  • التعامل مع مختلف العودة حرف صيغ
  • معالجة خطأ في بناء الجملة التقارير

مثل واقترح آخرون ، YAML يبدو أفضل رهان.

يمكنك أيضا استخدام المكدس ، واستخدام دفع/البوب الخوارزمية.هذه المباريات فتح/إغلاق علامات.

public string check()
    {
        ArrayList tags = getTags();


        int stackSize = tags.Count;

        Stack stack = new Stack(stackSize);

        foreach (string tag in tags)
        {
            if (!tag.Contains('/'))
            {
                stack.push(tag);
            }
            else
            {
                if (!stack.isEmpty())
                {
                    string startTag = stack.pop();
                    startTag = startTag.Substring(1, startTag.Length - 1);
                    string endTag = tag.Substring(2, tag.Length - 2);
                    if (!startTag.Equals(endTag))
                    {
                        return "Fout: geen matchende eindtag";
                    }
                }
                else
                {
                    return "Fout: geen matchende openeningstag";
                }
            }
        }

        if (!stack.isEmpty())
        {
            return "Fout: geen matchende eindtag";
        }            
        return "Xml is valid";
    }

ربما يمكنك التكيف بحيث يمكنك قراءة محتويات الملف.التعبيرات العادية هي أيضا فكرة جيدة.

يبدو لي أنه سيكون أفضل حالا باستخدام XML based config كما أن هناك بالفعل .صافي الطبقات التي يمكن قراءة وتخزين المعلومات لك بسهولة نسبيا.هل هناك سبب أن هذا غير ممكن ؟

@برنار: صحيح أن اليد تحرير XML مملة, ولكن بنية أن كنت تقدم بالفعل تبدو مشابهة جدا XML.

ثم نعم, لديه طريقة جيدة هناك.

@Gishu

في الواقع مرة واحدة كنت قد استوعب هرب الشخصيات بلدي regex ركض أبطأ قليلا من بلدي مكتوبة بخط اليد من أعلى إلى أسفل العودية محلل دون التعشيش (ربط البنود الفرعية لآبائهم) والإبلاغ عن الأخطاء اليد كتب محلل كان.

على regex كان أسرع قليلا في كتابة (على الرغم من أن لدي القليل من الخبرة مع اليد موزعي) ولكن بدون جيدة التقرير عن الخطأ.بمجرد إضافة إلى أن يصبح قليلا أكثر صعوبة وأطول القيام به.

أنا أيضا العثور على اليد كتب محلل أسهل للفهم نية.على سبيل المثال, هنا هو مقتطف من التعليمات البرمجية:

private static Node ParseNode(TextReader reader)
{
    Node node = new Node();
    int indentation = ParseWhitespace(reader);
    Expect(reader, '[');
    node.Key = ParseTerminatedString(reader, ':');
    node.Value = ParseTerminatedString(reader, ']');
}

بغض النظر عن استمرار تنسيق باستخدام التعابير المنطقية سيكون أسرع طريقة تحليل.في روبي ربما سيكون بضعة أسطر من التعليمات البرمجية.

\[KEY:(.*)\] 
\[SUBKEY:(.*)\]

هذين أن تحصل على قيمة SubValue في المجموعة الأولى.راجع MSDN على كيفية تطابق regex ضد سلسلة.

هذا شيء ينبغي أن يكون الجميع في كيتي.قبل Regex أيام يبدو مثل العصر الجليدي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top