C# Programming

قراءة ملفات CSV بكفاءة وتخزينها في مصفوفات باستخدام C#

Spread the love

تُعدّ ملفات القيم المُفصولة بفواصل (CSV) صيغةً شائعةً لتخزين البيانات الجدولية. تُقدّم هذه المقالة طريقتين فعّالَتين في C# لقراءة ملفات CSV وتخزين محتوياتها في مُصفّفات. سنتناول نهجًا يدويًا باستخدام فئة StreamReader، وحلًا أكثر تبسيطًا باستخدام فئة TextFieldParser من مكتبة Microsoft.VisualBasic.FileIO.

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

قراءة ملفات CSV باستخدام StreamReader

يُقدّم نهج StreamReader تحكّماً دقيقًا في عملية القراءة، مما يُمكّن من التخصيص لأنماط CSV المُتعددة. ومع ذلك، فهو يتطلّب معالجة يدوية أكبر للفاصلات وحالات الخطأ.


using System;
using System.IO;

public class CsvReaderStreamReader
{
    public static string[][] ReadCsv(string filePath)
    {
        string[][] data = new string[0][]; // تهيئة كمصفوفة فارغة
        try
        {
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    string[] values = line.Split(',');
                    Array.Resize(ref data, data.Length + 1);
                    data[data.Length - 1] = values;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"خطأ في قراءة ملف CSV: {ex.Message}");
        }
        return data;
    }

    public static void Main(string[] args)
    {
        string filePath = "data.csv"; 
        string[][] csvData = ReadCsv(filePath);

        if (csvData != null)
        {
            foreach (string[] row in csvData)
            {
                Console.WriteLine(string.Join(" ", row));
            }
        }
    }
}

يُعيد هذا الكود المُحسّن تحديد حجم المُصفوفة ديناميكيًا، متجنبًا حدّ الحجم الأولي التعسفي. كما يستخدم الاستيفاء السلسلي للرسائل المُفصّلة عن الخطأ وstring.Join لإخراج مُوجز.

قراءة ملفات CSV باستخدام TextFieldParser

يُبسّط TextFieldParser تحليل CSV، خاصةً للملفات المعقدة التي تحتوي على حقول مُقتبسة أو فاصلات مخصصة. فهو يُعالِج هذه التعقيدات تلقائيًا.


using Microsoft.VisualBasic.FileIO;
using System;

public class CsvReaderTextFieldParser
{
    public static string[][] ReadCsv(string filePath)
    {
        string[][] data = new string[0][];
        try
        {
            using (TextFieldParser parser = new TextFieldParser(filePath))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");

                while (!parser.EndOfData)
                {
                    string[] fields = parser.ReadFields();
                    Array.Resize(ref data, data.Length + 1);
                    data[data.Length - 1] = fields;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"خطأ في قراءة ملف CSV: {ex.Message}");
        }
        return data;
    }

    public static void Main(string[] args)
    {
        string filePath = "data.csv";
        string[][] csvData = ReadCsv(filePath);

        if (csvData != null)
        {
            foreach (string[] row in csvData)
            {
                Console.WriteLine(string.Join(" ", row));
            }
        }
    }
}

يُعالِج هذا الكود تحليل CSV بكفاءة باستخدام TextFieldParser. تذكّر بإضافة مرجع إلى مجموعة Microsoft.VisualBasic في مشروعك.

مقارنة الطرق

تُحقّق كِلا الطريقتين نفس النتيجة، لكن يُفضّل TextFieldParser عمومًا لمتانته وسهولة استخدامه، خاصةً مع ملفات CSV المعقدة. يُقدّم StreamReader تحكّماً أكبر للسيناريوهات المُتخصصة، لكنه يتطلّب معالجة دقيقة للأخطاء وإدارة الفواصل.

اترك تعليقاً

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