العمل مع CSV في C# (.NET): المكتبات والأمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع CSV في C# (.NET): نظرة عامة على الأدوات والأمثلة

CSV (Comma-Separated Values) هو أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في نظام C# (.NET) البيئي، توجد عدة طرق موثوقة للعمل مع هذا التنسيق: من الأدوات المدمجة إلى المكتبات الخارجية القوية. في هذه المقالة، سنستعرض الأساليب الرئيسية وأفضل الممارسات.



لماذا لا يجب كتابة محلل CSV يدويًا؟

قد يبدو تنسيق CSV بسيطًا للوهلة الأولى، لكنه عمليًا يحتوي على العديد من التفاصيل الدقيقة: الهروب من علامات الاقتباس، الفواصل داخل الحقول، فواصل مختلفة، أحرف السطر الجديد في القيم. استخدام المكتبات الجاهزة يخلصك من الصداع ومعالجة الحالات الحدية.



مكتبة CsvHelper — المعيار الذهبي

CsvHelper هي المكتبة الأكثر شيوعًا للعمل مع CSV في .NET. تدعم تعيين البيانات إلى فئات POCO، القراءة التدفقية، تكوين الفواصل والتشفيرات.

التثبيت عبر NuGet:

Install-Package CsvHelper


مثال لقراءة CSV إلى قائمة كائنات

using CsvHelper;using System.Globalization;

public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}

var users = new List<User>();using (var reader = new StreamReader("users.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){ users = csv.GetRecords<User>().ToList();}


مثال لكتابة CSV من مجموعة

using (var writer = new StreamWriter("output.csv"))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){    csv.WriteRecords(users);}


المحلل المدمج: TextFieldParser (Microsoft.VisualBasic)

إذا كنت لا ترغب في إضافة تبعيات خارجية، يوجد في .NET المحلل المدمج TextFieldParser من مساحة الأسماء Microsoft.VisualBasic.FileIO. وهو متاح في .NET Framework و .NET Core/.NET 5+ (يتطلب تثبيت حزمة Microsoft.VisualBasic).



مثال لاستخدام TextFieldParser

using Microsoft.VisualBasic.FileIO;

using (var parser = new TextFieldParser("data.csv")){ parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true;

while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); }}

الإيجابيات: لا يتطلب مكتبات خارجية. السلبيات: أقل مرونة من CsvHelper، لا يوجد تعيين تلقائي للفئات.



العمل مع الملفات الكبيرة: المعالجة التدفقية

عند العمل مع ملفات CSV بحجم يتجاوز 100 ميجابايت، من المهم تجنب تحميل الملف بأكمله في الذاكرة. كلا المكتبتين تدعمان المعالجة التدفقية:

  • CsvHelper — استخدم GetRecords<T>() في حلقة foreach دون استدعاء .ToList().
  • TextFieldParser — يقرأ سطرًا تلو الآخر، وهو فعال أيضًا.


مثال للقراءة التدفقية مع CsvHelper

using (var reader = new StreamReader("large.csv"))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){    foreach (var record in csv.GetRecords<User>())    {        ProcessUser(record); // معالجة كل سجل على حدة    }}


معالجة الأخطاء والتحقق من صحة البيانات

عند استيراد CSV، قد تكون البيانات غير صحيحة. يسمح CsvHelper بتكوين معالجة الأخطاء عبر الأحداث:

csv.Configuration.BadDataFound = context =>{    Console.WriteLine($"خطأ في السطر {context.RawRow}: {context.RawRecord}");};

يمكن أيضًا استخدام السمات للتحقق من صحة الحقول:

public class Product{    [Name("ProductId")]    public int Id { get; set; }        [Required]    public string Nam                    

توصيات