العمل مع CSV في JavaScript (Node.js): المكتبات والأمثلة العملية
CSV (قيم مفصولة بفواصل) هو أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في نظام Node.js البيئي، توجد عدة مكتبات ناضجة تسمح بقراءة ومعالجة وإنشاء ملفات CSV بكفاءة. في هذه المقالة، سنستعرض الأدوات الرئيسية وإمكانياتها ونقدم أمثلة عملية على الكود.
المكتبات الشائعة للعمل مع CSV
1. csv-parser — محلل تدفق سريع
هذه المكتبة هي المعيار لقراءة CSV في Node.js. تعمل في وضع التدفق (stream)، مما يسمح بمعالجة الملفات من أي حجم دون تحميلها بالكامل في الذاكرة.
التثبيت:
npm install csv-parserمثال على قراءة ملف CSV:
const fs = require('fs');const csv = require('csv-parser');
const results = [];
fs.createReadStream('data.csv') .pipe(csv()) .on('data', (row) => { results.push(row); }) .on('end', () => { console.log('تمت قراءة CSV بنجاح'); console.log(results.slice(0, 3)); // أول 3 سجلات });الميزات الرئيسية:
- دعم الفواصل المخصصة (الافتراضي هو الفاصلة)
- التعرف التلقائي على الرؤوس من السطر الأول
- إمكانية تخطي الأسطر الفارغة
- استهلاك منخفض للذاكرة بفضل المعالجة التدفقية
2. csv-stringify — إنشاء CSV من الكائنات
هذه الأداة هي جزء من عائلة csv وهي مخصصة لتوليد سلاسل CSV أو تدفقات من كائنات JavaScript.
التثبيت:
npm install csv-stringifyمثال على كتابة البيانات إلى CSV:
const { stringify } = require('csv-stringify');const fs = require('fs');
const data = [ { name: 'آنا', age: 28, city: 'موسكو' }, { name: 'إيفان', age: 35, city: 'سانت بطرسبرغ' }, { name: 'أولغا', age: 22, city: 'قازان' }];
const writableStream = fs.createWriteStream('output.csv');const stringifier = stringify({ header: true });
stringifier.pipe(writableStream);data.forEach(row => stringifier.write(row));stringifier.end();
console.log('تم إنشاء ملف output.csv');الإمكانيات:
- الهروب التلقائي للأحرف الخاصة (علامات الاقتباس، الفواصل)
- تخصيص فاصل الأعمدة
- دعم الرؤوس المخصصة
- العمل في الوضع المتزامن وغير المتزامن
3. csv-writer — واجهة برمجة تطبيقات بسيطة وبديهية
تقدم هذه المكتبة واجهة أبسط لكتابة CSV، خاصة إذا كنت تعمل مع كميات صغيرة من البيانات.
التثبيت:
npm install csv-writerمثال على الكتابة:
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({ path: 'users.csv', header: [ { id: 'id', title: 'المعرف' }, { id: 'name', title: 'الاسم' }, { id: 'email', title: 'البريد الإلكتروني' } ]});
const records = [ { id: 1, name: 'أليكسي', email: 'alex@example.com' }, { id: 2, name: 'ماريا', email: 'maria@example.com' }];
csvWriter.writeRecords(records) .then(() => console.log('تم إنشاء ملف CSV'));سيناريوهات الاستخدام المتقدمة
معالجة الملفات الكبيرة مع تحويل البيانات
لنقم بدمج القراءة والكتابة في تدفق واحد لمعالجة البيانات أثناء التنقل:
const fs = require('fs');const csv = require('csv-parser');const { stringify } = require('csv-stringify');
const readStream = fs.createReadStream('input.csv');const writeStream = fs.createWriteStream('output_transformed.csv');const stringifier = stringify({ h