العمل مع CSV في C# (.NET): دليل شامل
CSV (قيم مفصولة بفواصل) هو أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في نظام C# (.NET) البيئي، توجد عدة طرق للعمل مع ملفات CSV: من التحليل اليدوي إلى استخدام مكتبات خارجية قوية. في هذه المقالة، سنستعرض جميع الطرق الأساسية لقراءة وكتابة ومعالجة بيانات CSV في .NET.
1. التحليل اليدوي لـ CSV باستخدام StreamReader
أبسط طريقة هي استخدام الفئات القياسية StreamReader و String.Split. ومع ذلك، لا تأخذ هذه الطريقة في الاعتبار الحالات المعقدة (الاقتباسات، الفواصل داخل البيانات، فواصل الأسطر).
using System;using System.IO;using System.Linq;
public class CsvSimpleReader{ public void ReadCsv(string filePath) { using (var reader = new StreamReader(filePath)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); Console.WriteLine(string.Join(" | ", values)); } } }}العيوب: لا يعالج الفواصل والاقتباسات المُهربة. للمشاريع الحقيقية، استخدم طرقًا أكثر موثوقية.
2. استخدام Microsoft.VisualBasic.FileIO.TextFieldParser (لـ .NET Framework)
في .NET Framework، يوجد محلل CSV مدمج — TextFieldParser. يعالج بشكل صحيح الاقتباسات والمحددات.
using Microsoft.VisualBasic.FileIO;using System;using System.IO;
public class CsvTextFieldParser{ public void ParseCsv(string filePath) { using (var parser = new TextFieldParser(filePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(",");
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); } } }}هام: في .NET Core / .NET 5+، هذه الفئة متاحة عبر حزمة Microsoft.VisualBasic (NuGet).
3. مكتبة CsvHelper (الطريقة الموصى بها)
CsvHelper هي المكتبة الأكثر شيوعًا للعمل مع CSV في .NET. تدعم ربط الفئات، استعلامات LINQ، تكوين المحددات والترميزات.
التثبيت عبر NuGet:
Install-Package CsvHelper3.1 قراءة CSV إلى قائمة كائنات
using System.Globalization;using CsvHelper;using CsvHelper.Configuration;using System.IO;using System.Linq;using System.Collections.Generic;
public class Person{ public string Name { get; set; } public int Age { get; set; } public string Email { get; set; }}
public void ReadCsvWithCsvHelper(string filePath){ var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, Delimiter = ",", MissingFieldFound = null };
using (var reader = new StreamReader(filePath)) using (var csv = new CsvReader(reader, config)) { var records = csv.GetRecords<Person>().ToList(); foreach (var person in records) { Console.WriteLine($"{person.Name}, {person.Age}, {person.Email}"); } }}3.2 كتابة CSV من مجموعة كائنات
public void WriteCsvWithCsvHelper(string filePath, List<Person> people){ using (var writer = new StreamWriter(filePath)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(people); }}3.3 التحكم اليدوي في الحقول (بدون ربط)
public void ManualCsvWrite(string filePath){ using (var writer = new StreamWriter(filePath)) using (va