C# Programming

كتابة ملفات CSV بكفاءة في C#

Spread the love

تُعد ملفات القيم المُفصولة بفواصل (CSV) صيغةً شائعةً لتخزين البيانات الجدولية. وبفضل بساطتها، يسهُل الوصول إليها، لكن معالجتها برمجياً يتطلب دراسةً دقيقة. تستعرض هذه المقالة طريقتين مختلفتين في C# لكتابة البيانات في ملفات CSV: الاستفادة من مكتبة CsvHelper القوية، واستخدام طريقة File.WriteAllText() المُدمجة. وتُقدّم كل طريقة مزايا فريدة، مما يجعل الاختيار الأمثل يعتمد على تعقيد البيانات ومتطلبات المشروع.

محتويات الجدول

الكتابة إلى CSV باستخدام CsvHelper

تُقدّم مكتبة CsvHelper حلاً قوياً ومرناً لمعالجة ملفات CSV في C#. إنّ إدارتها الفعّالة للاقتباس والهروب والفاصلات المختلفة يجعلها مثاليةً لمجموعات البيانات المعقدة. ابدأ بتثبيت حزمة CsvHelper NuGet عبر مدير الحزم المفضل لديك (مثل، مدير حزم NuGet في Visual Studio).


using CsvHelper;
using CsvHelper.Configuration;
using System;
using System.Globalization;
using System.IO;
using System.Collections.Generic;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class CsvHelperExample
{
    public static void Main(string[] args)
    {
        List<Person> people = new List<Person>()
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Jane", LastName = "Doe", Age = 25 },
            new Person { FirstName = "Peter", LastName = "Jones", Age = 40 }
        };

        string filePath = "output.csv";

        using (var writer = new StreamWriter(filePath))
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(people);
        }

        Console.WriteLine($"تمت كتابة البيانات إلى {filePath}");
    }
}

يُظهر هذا المثال بساطة كتابة قائمة من كائنات Person إلى ملف CSV. يضمن CultureInfo.InvariantCulture تنسيقاً ثابتاً بغض النظر عن إعدادات النظام. تضمن عبارات using التخلص السليم من الموارد.

الكتابة إلى CSV باستخدام WriteAllText()

لمجموعات البيانات الأصغر حجماً والأقل تعقيداً، توفر طريقة File.WriteAllText() نهجاً مباشراً. ومع ذلك، تتطلب هذه الطريقة معالجة يدوية للفاصلات والاقتباسات، والتي قد تصبح مرهقة مع البيانات التي تحتوي على هذه الأحرف داخل الحقول.


using System;
using System.IO;
using System.Text;

public class WriteAllTextExample
{
    public static void Main(string[] args)
    {
        string[,] data = {
            {"FirstName", "LastName", "Age"},
            {"John", "Doe", "30"},
            {"Jane", "Doe", "25"},
            {"Peter", "Jones", "40"}
        };

        StringBuilder csvBuilder = new StringBuilder();
        for (int i = 0; i < data.GetLength(0); i++)
        {
            for (int j = 0; j < data.GetLength(1); j++)
            {
                csvBuilder.Append(data[i, j]);
                if (j < data.GetLength(1) - 1)
                {
                    csvBuilder.Append(",");
                }
            }
            csvBuilder.AppendLine();
        }

        string filePath = "output_simple.csv";
        File.WriteAllText(filePath, csvBuilder.ToString());

        Console.WriteLine($"تمت كتابة البيانات إلى {filePath}");
    }
}

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

اختيار الطريقة المناسبة

يعتمد الاختيار بين هاتين الطريقتين كلياً على احتياجات المشروع المحددة. لمجموعات البيانات الكبيرة أو المعقدة مع احتمال وجود أحرف خاصة داخل الحقول، يُوصى بشدة باستخدام CsvHelper نظرًا لمعالجة الأخطاء القوية وإدارة البيانات الفعالة. بالنسبة لمجموعات البيانات البسيطة جدًا، قد تكفي File.WriteAllText()، ولكن يجب مراعاة حدودها بعناية. تذكر دائمًا تضمين معالجة الأخطاء المناسبة (مثل، كتل try-catch) لإدارة الاستثناءات المحتملة مثل IOException في بيئات الإنتاج.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *