تحليل الملفات المحددة الكبيرة مع عدد ديناميكي من الأعمدة
-
03-10-2019 - |
سؤال
ما هو أفضل طريقة لتحليل ملف محدد عندما تكون الأعمدة غير معروفة قبل تحليل الملف؟
تنسيق الملف هو 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 سوف تفعل الحيلة.
نصائح أخرى
يمكنك القيام بذلك بضع طرق.
- إذا كانت الخصائص الموجودة على الكائنات الخاصة بك لها نفس اسم الأعمدة في ملف البيانات الخاص بك ، فيمكنك استخدام الانعكاس لتحديد الأعمدة التي يجب مطابقة الخصائص.
- إذا كانت الخصائص الموجودة على كائناتك تحتوي على أسماء مختلفة ، فيمكنك كتابة مخطط تعيين مخصص يقول "للعمود X ، تعيين إلى الخاصية Y".
- يمكنك إنشاء سمات مخصصة لخصائص الكائن الخاصة بك والتي تشير إلى اسم العمود الذي يرسمه ، واستخدام الانعكاس لقراءة تلك السمات.
تفترض كل هذه الخطوات أن أسماء الأعمدة في ملفات البيانات الخاصة بك ستكون هي نفسها بالنسبة للبيانات التي تمثلها (أي ، سيكون العنوان_1 دائمًا اسم العمود لبيانات "سطر العنوان واحد").