سؤال

أنا أتطلع إلى تحليل سلسلة محددة، وهو أمر حسب ترتيب

أ، ب، ج

ولكن هذا مثال بسيط جدًا، وقد يصبح تحليل البيانات المحددة أمرًا معقدًا؛على سبيل المثال

1،"خوارزميتك البسيطة، لقد فشلت"،صحيح

من شأنه أن يفجر تنفيذ سلسلة ساذجة.سبليت إلى أجزاء صغيرة.هل هناك أي شيء يمكنني استخدامه/سرقته/نسخه ولصقه بحرية والذي يوفر حلاً مضادًا نسبيًا لتحليل النص المحدد؟صافي، بلوكس.

تحديث: قررت أن أذهب مع TextFieldParser, ، والذي يعد جزءًا من كومة الأشياء الجيدة الخاصة بـ VB.NET المخفية في Microsoft.VisualBasic.DLL.

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

المحلول

أنا استخدم هذا للقراءة من ملف

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

أنا متأكد من أن شخصًا ما هنا يمكنه تحويل هذا إلى محلل سلسلة موجودة في الذاكرة.

نصائح أخرى

مكتبة شاملة جدا يمكن العثور عليها هنا: FileHelpers

لست على علم بأي إطار عمل، ولكن تعمل آلة حالة بسيطة:

  • الحالة 1:اقرأ كل حرف حتى تضغط على "أو"
    • في حالة ":انتقل إلى الولاية 2
    • في حالة أ،:انتقل إلى الولاية 3
    • في حالة نهاية الملف:انتقل إلى الولاية 4
  • الحالة 2:اقرأ كل حرف حتى تضغط على "
    • في حالة ":انتقل إلى الولاية 1
    • في حالة نهاية الملف:إما الانتقال إلى الحالة 4 أو الإشارة إلى خطأ بسبب سلسلة غير منتهية
  • الحالة 3:أضف المخزن المؤقت الحالي إلى مصفوفة الإخراج، وحرك المؤشر للأمام خلف، ثم عد إلى الحالة 1.
  • الحالة 4:هذه هي الحالة النهائية، ولا تفعل شيئًا سوى إرجاع مصفوفة الإخراج.

مثل

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

هناك بعض الإجابات الجيدة هنا: تقسيم سلسلة متجاهلة الأقسام المقتبسة

قد ترغب في إعادة صياغة سؤالك لشيء أكثر دقة (على سبيل المثال: ما مقتطف التعليمات البرمجية أو المكتبة التي يمكنني استخدامها لتحليل بيانات CSV في .NET?).

للقيام بمقبس وقح، كنت أعمل في مكتبة لفترة من الوقت تسمى fotelo (محمل النص المنسق) الذي أستخدمه لتحليل كميات كبيرة من النص بسرعة استنادًا إلى المحدد أو الموضع أو التعبير العادي.بالنسبة لسلسلة سريعة، يعد هذا أمرًا مبالغًا فيه، ولكن إذا كنت تعمل باستخدام سجلات أو كميات كبيرة، فقد يكون هذا هو ما تحتاجه تمامًا.إنه يعمل على نموذج ملف تحكم مشابه لـ SQL*Loader (نوع من الإلهام وراءه).

أن تأتي متأخرًا أفضل من ألا تأتي أبدًا (أضف إلى اكتمال SO):

http://www.codeproject.com/KB/database/CsvReader.aspx

هذا واحد وما يليها من القواعد.

غيغاجول

أعتقد أن الإطار العام سيحتاج إلى التحديد بين شيئين:1.ما هي الحروف الفاصلة.2.في أي حالة لا يتم احتساب هذه الأحرف (على سبيل المثال، عندما تكون بين علامتي الاقتباس).

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

أبسط طريقة هي فقط تقسيم السلسلة إلى مصفوفة char والبحث عن محددات السلسلة وتقسيم char.

يجب أن يكون اختبار الوحدة سهلًا نسبيًا.

يمكنك تغليفه بطريقة ملحقة مشابهة لطريقة .Spilt الأساسية.

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