العمل مع CSV في JavaScript (Node.js): دليل شامل
CSV (قيم مفصولة بفواصل) — أحد أشهر التنسيقات لتبادل البيانات الجدولية. في نظام Node.js البيئي، توجد عدة مكتبات قوية لتحليل وإنشاء ومعالجة ملفات CSV. في هذا المقال، سنستعرض الأدوات الأساسية، طريقة تثبيتها، أمثلة على الاستخدام، وأفضل الممارسات.
المكتبات الشائعة للعمل مع CSV في Node.js
في JavaScript (Node.js)، تُستخدم ثلاث مكتبات بشكل شائع للعمل مع CSV:
- csv-parser — محلل تدفقي سريع يعمل في وضع البث (streaming)
- csv-stringify — مولد CSV من كائنات أو مصفوفات JavaScript
- fast-csv — مكتبة شاملة تجمع بين التحليل والإنشاء
تثبيت المكتبات
لتثبيت الحزم المطلوبة، استخدم npm:
npm install csv-parser csv-stringify fast-csvتحليل CSV باستخدام csv-parser
تعمل مكتبة 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[0]); });بشكل افتراضي، يستخدم csv-parser السطر الأول من الملف كعناوين ويعيد كائنات بمفاتيح مقابلة.
إنشاء CSV باستخدام csv-stringify
تتيح مكتبة csv-stringify إنشاء سلاسل CSV من مصفوفات أو كائنات JavaScript.
مثال: إنشاء CSV من كائنات
const { stringify } = require('csv-stringify');const fs = require('fs');
const data = [ { name: 'إيفان', age: 25, city: 'موسكو' }, { name: 'ماريا', age: 30, city: 'سانت بطرسبرغ' }, { name: 'أليكسي', age: 28, city: 'قازان' }];
const writableStream = fs.createWriteStream('output.csv');
const stringifier = stringify({ header: true, columns: ['name', 'age', 'city']});
stringifier.pipe(writableStream);data.forEach(row => stringifier.write(row));stringifier.end();الحل الشامل: fast-csv
توفر fast-csv كلاً من التحليل والإنشاء لـ CSV، كما تدعم تنسيقات مختلفة (TSV، فواصل مخصصة).
مثال: تحليل CSV باستخدام fast-csv
const fs = require('fs');const csv = require('@fast-csv/parse');
const rows = [];
fs.createReadStream('data.csv') .pipe(csv.parse({ headers: true })) .on('error', error => console.error(error)) .on('data', row => rows.push(row)) .on('end', (rowCount) => { console.log(`تمت معالجة ${rowCount} صف`); console.log('البيانات:', rows); });مثال: كتابة CSV باستخدام fast-csv
const fs = require('fs');const csv = require('@fast-csv/format');
const data = [ ['الاسم', 'العمر', 'المدينة'], ['إيفان', '25', 'موسكو'], ['ماريا', '30', 'سانت بطرسبرغ']];
const ws = fs.createWriteStream('output.csv');csv.write(data, { headers: true }).pipe(ws);العمل مع الملفات الكبيرة والأداء
عند العمل مع ملفات CSV بحجم يتجاوز 100 ميجابايت، يُوصى باستخدام المعالجة التدفقية. جميع المكتبات الثلاث المذكورة تدعم التدفقات (streams).
مثال: معالجة ملف CSV كبير صفًا بصف
const fs = require('fs');const csv = require('csv-parser');
let rowCount = 0;
fs.createReadStream('large-file.csv') .pipe(csv()) .on('data', (row) => { rowC