تحليل الملفات المحددة الكبيرة مع عدد ديناميكي من الأعمدة

StackOverflow https://stackoverflow.com/questions/2782563

سؤال

ما هو أفضل طريقة لتحليل ملف محدد عندما تكون الأعمدة غير معروفة قبل تحليل الملف؟

تنسيق الملف هو RightMove v3 (.blm) ، يبدو أن الهيكل مثل:

#HEADER#
Version : 3
EOF : '^'
EOR : '~'
#DEFINITION#
AGENT_REF^ADDRESS_1^POSTCODE1^MEDIA_IMAGE_00~ // can be any number of columns
#DATA#
agent1^the address^the postcode^an image~
agent2^the address^the postcode^^~      // the records have to have the same number of columns as specified in the definition, however they can be empty
etc
#END#

من المحتمل أن تكون الملفات كبيرة جدًا ، فإن ملف المثال الذي لدي هو 40 ميجابايت ولكن يمكن أن يكون عدة مئات من ميغابايت. فيما يلي الرمز الذي بدأت فيه قبل أن أدرك أن الأعمدة كانت ديناميكية ، فأنا أفتح fileStream لأنني قرأت أن أفضل طريقة للتعامل مع الملفات الكبيرة. لست متأكدًا من أن فكرتي في وضع كل سجل في قائمة ، فإن المعالجة جيدة ، لا أعرف ما إذا كان ذلك سيعمل مع مثل هذه الملفات الكبيرة.

List<string> recordList = new List<string>();

try
{
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        StreamReader file = new StreamReader(fs);
        string line;
        while ((line = file.ReadLine()) != null)
        {
            string[] records = line.Split('~');

            foreach (string item in records)
            {
                if (item != String.Empty)
                {
                    recordList.Add(item);
                }
            }

        }
    }
}
catch (FileNotFoundException ex)
{
    Console.WriteLine(ex.Message);
}

foreach (string r in recordList)
{
    Property property = new Property();

    string[] fields = r.Split('^');

    // can't do this as I don't know which field is the post code
    property.PostCode = fields[2];
    // etc

    propertyList.Add(property);
}

أي أفكار حول كيفية القيام بذلك بشكل أفضل؟ إنه C# 3.0 و .NET 3.5 إذا كان ذلك يساعد.

شكرًا،

أنيلي

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

المحلول

إذا تمكنت من تجريد بعض الخطوط في البداية (محتوى الرأس ، وخطوط # xxx #) ، فهو مجرد ملف CSV مع ^ كما المحدد ، لذلك أي فئة قارئ CSV سوف تفعل الحيلة.

نصائح أخرى

يمكنك القيام بذلك بضع طرق.

  1. إذا كانت الخصائص الموجودة على الكائنات الخاصة بك لها نفس اسم الأعمدة في ملف البيانات الخاص بك ، فيمكنك استخدام الانعكاس لتحديد الأعمدة التي يجب مطابقة الخصائص.
  2. إذا كانت الخصائص الموجودة على كائناتك تحتوي على أسماء مختلفة ، فيمكنك كتابة مخطط تعيين مخصص يقول "للعمود X ، تعيين إلى الخاصية Y".
  3. يمكنك إنشاء سمات مخصصة لخصائص الكائن الخاصة بك والتي تشير إلى اسم العمود الذي يرسمه ، واستخدام الانعكاس لقراءة تلك السمات.

تفترض كل هذه الخطوات أن أسماء الأعمدة في ملفات البيانات الخاصة بك ستكون هي نفسها بالنسبة للبيانات التي تمثلها (أي ، سيكون العنوان_1 دائمًا اسم العمود لبيانات "سطر العنوان واحد").

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