العمل مع CSV في PHP: دليل شامل
CSV (قيم مفصولة بفواصل) — أحد أشهر التنسيقات لتبادل البيانات الجدولية. في PHP، يتم العمل مع CSV بشكل أصلي دون الحاجة لتثبيت مكتبات إضافية. في هذه المقالة، سنستعرض جميع الجوانب: من القراءة الأساسية إلى المعالجة المتقدمة للملفات الكبيرة.
الدوال الأساسية للعمل مع CSV
توفر PHP دالتين رئيسيتين للعمل مع CSV:
fgetcsv()— قراءة سطر CSV من ملفfputcsv()— كتابة سطر بتنسيق CSV
بالإضافة إلى ذلك، تُستخدم دوال التعامل مع الملفات القياسية: fopen()، fclose()، file().
قراءة ملف CSV في PHP
أبسط طريقة لقراءة CSV هي استخدام حلقة while مع fgetcsv():
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { // قراءة الرؤوس (السطر الأول) $headers = fgetcsv($handle, 1000, ','); // قراءة باقي الأسطر while (($row = fgetcsv($handle, 1000, ',')) !== false) { echo "الاسم: " . $row[0] . ", البريد الإلكتروني: " . $row[1] . "<br>"; } fclose($handle);}?>معاملات fgetcsv():
handle— مؤشر الملفlength— أقصى طول للسطر (الافتراضي 0 — بدون حدود)separator— فاصل الحقول (الافتراضي فاصلة)enclosure— رمز علامات الاقتباس (الافتراضي علامات اقتباس مزدوجة)escape— رمز الهروب (الافتراضي شرطة مائلة عكسية)
قراءة CSV بفواصل مخصصة
ليست كل ملفات CSV تستخدم الفاصلة. غالبًا ما تُستخدم الفاصلة المنقوطة (;) أو علامة التبويب:
<?php$handle = fopen('data.tsv', 'r');while (($row = fgetcsv($handle, 1000, "\\t")) !== false) { print_r($row);}fclose($handle);?>كتابة البيانات إلى CSV
تتعامل الدالة fputcsv() تلقائيًا مع الهروب وعلامات الاقتباس:
<?php$data = [ ['إيفان', 'ivan@example.com', 25], ['ماريا', 'maria@example.com', 30], ['بيتر', 'petr@example.com', 28]];
$handle = fopen('users.csv', 'w');
// كتابة الرؤوسfputcsv($handle, ['الاسم', 'البريد الإلكتروني', 'العمر']);
// كتابة البياناتforeach ($data as $row) { fputcsv($handle, $row);}
fclose($handle);echo "تم إنشاء ملف CSV بنجاح!";?>معاملات fputcsv():
handle— مؤشر الملفfields— مصفوفة الحقول للكتابةseparator— فاصل الحقولenclosure— رمز علامات الاقتباسescape— رمز الهروب
تصدير البيانات إلى CSV للتحميل
غالبًا ما يكون مطلوبًا إنشاء CSV وتقديمه للمستخدم للتحميل:
<?php$data = [ ['المنتج', 'السعر', 'الكمية'], ['لابتوب', 75000, 10], ['فأرة', 1500, 50], ['لوحة مفاتيح', 3500, 30]];
header('Content-Type: text/csv; charset=utf-8');header('Content-Disposition: attachment; filename="products.csv"');
$output = fopen('php://output', 'w');// إضافة BOM لعرض السيريلية بشكل صحيح في Excelfprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($data as $row) { fputcsv($output, $row);}
fclose($output);exit;?>معالجة ملفات CSV الكبيرة
عند العمل مع الملفات الكبيرة (مئات الآلاف من الأسطر)، من المهم تجنب تحميل الملف بأكمله في الذاكرة. استخدم المعالجة التدفقية:
<?phpfunction processLargeCSV($filename, $batchSize = 1000) { $handle = fopen($filename,