تُعدّ ملفات القيم المُفصولة بفواصل (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
تحكّماً أكبر للسيناريوهات المُتخصصة، لكنه يتطلّب معالجة دقيقة للأخطاء وإدارة الفواصل.