العودة إلى المدونة

إدارة CSV في Node.js باستخدام Node-CSV

إدارة CSV في Node.js باستخدام Node-CSV

ملف CSV هو ملف نصي بسيط يخزن البيانات في تنسيق جدولي. في معظم الحالات، تستخدم ملفات CSV الفواصل (,) كمحدد، ومن هنا جاء الاسم CSV (القيم المفصولة بفواصل). ويُستخدم في الحالات التي يكون فيها توافق البيانات أمرًا مهمًا حيث يمكن فتح ملفات CSV باستخدام أي محرر نصوص، وتطبيقات جداول البيانات، وغيرها من الأدوات المتخصصة. في الواقع، توفر العديد من لغات البرمجة دعمًا مدمجًا لـ CSV.

في هذا الدليل، سنتعلم كيفية استخدام CSV في تطبيق Node.js نموذجي.

CSV في Node.js

إن Node.js هي بيئة تشغيل جافا سكريبت مفتوحة المصدر ومتعددة المنصات. لقد أصبحت واحدة من أكثر الخلفيات البرمجية شيوعًا والتي تشغل العديد من خدمات الويب في جميع أنحاء الإنترنت. حتى الشركات الكبرى مثل Netflix و Uber تستخدم Node.js لتشغيل خدماتها.

تحتوي Node.js أيضًا على العديد من الوحدات البرمجية المتاحة للنشر لإضافة وظائف إضافية إلى المشروع. عندما يتعلق الأمر بـ CSV، هناك العديد من الوحدات المتاحة للاستخدام، على سبيل المثال، node-csv, fast-csv، و papaparse إلخ.

كما يوحي عنوان الدليل، سنقوم باستخدام node-csv لقراءة ملفات CSV باستخدام دفق بيانات Node.js. سنقوم أيضًا بتوضيح كيفية العمل مع البيانات التي تم تحليلها، على سبيل المثال، نقل البيانات إلى قاعدة بيانات SQLite.

المتطلبات الأساسية

الخطوة 1 – تثبيت البرامج اللازمة

لهذا الدليل، قمت بإنشاء خادم خفيف الوزن يعمل بنظام التشغيل Ubuntu 22.04 LTS (متصل عبر SSH):

الآن، سنقوم بتثبيت Node.js و SQLite عليه.

  • تثبيت Node.js LTS

تتوفر Node.js مباشرة من مستودعات حزم Ubuntu الرسمية. ومع ذلك، فهي ليست النسخة الأحدث. لهذا السبب سنعتمد على مستودع خارجي (Nodesource) للحصول على أحدث حزم Node.js.

أضف مستودع Node.js LTS:

الآن، قم بتثبيت Node.js LTS:

  • تثبيت SQLite

سنقوم بتثبيت SQLite مباشرة من مستودعات حزم Ubuntu. قم بتشغيل الأوامر التالية:

الخطوة 2 – إعداد دليل المشروع

في هذا القسم، سنقوم بإعداد دليل مخصص لمشروعنا. سيستضيف جميع ملفات المشروع بالإضافة إلى الوحدات الإضافية.

إنشاء دليل جديد:

انتقل إلى الدليل:

بعد ذلك، قم بتشغيل الأمر التالي للإعلان عن الدليل كـ npm مشروع:

بمجرد تهيئة مجلد المشروع، يمكننا البدء في تثبيت الحزم والوحدات اللازمة. أولاً، سنقوم بتثبيت node-csv:

إن وحدة node-csv هي في الواقع مجموعة من عدة وحدات أخرى: csv-generate, csv-parse (لتحليل ملفات CSV)، csv-stringify (لكتابة البيانات إلى CSV)، و stream-transform.

بعد ذلك، نحتاج إلى وحدة للاتصال بـ SQLite. سيقوم الأمر التالي بتثبيت وحدة node-sqlite3 :

المكون الذي نحتاجه لمشروعنا هو ملف CSV. لأغراض التوضيح، سنستخدم ملف CSV الخاص بالهجرة في نيوزيلندا:

دعنا نلقي نظرة سريعة على محتوى الملف:

هنا،

  • يصف السطر الأول أسماء الأعمدة.

  • تحتوي السطور التالية على قيم هذه الحقول.

  • يتم فصل كل صف بسطر جديد (\n).

  • يتم فصل كل نقطة بيانات بفاصلة (,).

ومع ذلك، لا يقتصر CSV على استخدام الفواصل كمحدد. تشمل المحددات الشائعة الأخرى النقطتين الرأسيتين (:)، الفاصلة المنقوطة (;)، وعلامات التبويب (\td).

الخطوة 3 – قراءة CSV

في هذا القسم، سنقوم بتوضيح تنفيذ برنامج نموذجي يقرأ البيانات ويحللها من ملف CSV.

أنشئ ملف JavaScript جديدًا:

افتح الملف في محرر النصوص المفضل لديك:

أولاً، سنقوم باستيراد وحدات fs و csv-parse :

هنا،

  • أولاً، يتم تعيين المتغير fs كائن fs الذي يعيد دالة Node.js require() عند استيراد الوحدة.

  • بعد ذلك، يتم استخراج دالة parse من الكائن الذي تعيده دالة require() إلى متغير parse باستخدام صيغة التفكيك.

بعد ذلك، سنقوم بإضافة أكواد لقراءة ملف CSV:

هنا،

  • نحن نستدعي createReadStream() من وحدة fs ونمرر ملف CSV الذي نريد قراءته كمعامل. ثم يقوم بإنشاء تدفق قابل للقراءة عن طريق تقسيم الملف الأكبر إلى أجزاء أصغر.

  • بعد إنشاء التدفق، تقوم دالة pipe() بتوجيه أجزاء من بيانات التدفق إلى تدفق آخر. يتم إنشاء هذا التدفق الجديد عند استدعاء دالة parse() من وحدة csv-module.

  • تقوم وحدة csv-module بنشر تدفق تحويل قابل للقراءة/الكتابة يأخذ جزءًا من البيانات ويحوله إلى شكل آخر.

  • تقبل دالة parse() كائنات ذات خصائص. يقوم الكائن بمعالجة البيانات المحللة بشكل أكبر. هنا، يأخذ الكائن الخصائص التالية:

    • delimiter: حرف المحدد لفصل القيم. في حالة ملف CSV المستهدف، فهو الفاصلة (,).

    • from_line: عدد الأسطر التي سيبدأ المحلل في التحليل منها. مع القيمة المحددة 2، سيتخطى المحلل السطر 1 ويبدأ عند السطر 2. وبهذا الترتيب، نتجنب دمج أسماء الأعمدة في البيانات المحللة.

بعد ذلك، سنقوم بإرفاق حدث تدفق باستخدام دالة on() من Node.js:

هنا،

  • عند إطلاق حدث معين، يسمح حدث التدفق للدالة باستهلاك جزء من البيانات.

  • عندما تكون البيانات المحللة بواسطة دالة parse() جاهزة للاستهلاك، فإنها تطلق حدث data .

  • للوصول إلى البيانات، نقوم بتمرير دالة استدعاء (callback) إلى دالة on() التي تأخذ المعامل row.

  • المعامل row هو جزء من البيانات في شكل مصفوفة (نتيجة التحليل).

  • أخيرًا، يتم تسجيل البيانات في وحدة التحكم (console) باستخدام console.log().

لإنهاء البرنامج، سنقوم بإضافة أحداث تدفق إضافية لمعالجة الأخطاء وطباعة رسالة نجاح عند استهلاك جميع البيانات في ملف CSV. قم بتحديث الكود على النحو التالي:

هنا،

  • يتم إطلاق الحدث end عندما يتم استهلاك جميع البيانات الموجودة في ملف CSV. وينتج عن ذلك استدعاء console.log() التي تطبع رسالة نجاح.

  • يتم إطلاق الحدث error عند مواجهة خطأ أثناء تحليل بيانات CSV. وينتج عن ذلك استدعاء console.log() التي تطبع رسالة خطأ.

يجب أن يبدو الكود النهائي كما يلي:

احفظ الملف وأغلق المحرر. نحن الآن جاهزون لتشغيل البرنامج. قم بتشغيله باستخدام Node.js:

يجب أن تبدو المخرجات كالتالي:

لاحظ أنه يتم استهلاك البيانات وتحويلها وطباعتها على وحدة التحكم. وبما أنها عملية مستمرة، فستظهر كما لو أنه يتم تنزيل البيانات بدلاً من طباعة المخرجات دفعة واحدة.

الخطوة 4 – نقل بيانات CSV إلى قاعدة بيانات

حتى الآن، تعلمنا كيفية تحليل ملف CSV باستخدام node-csv. سيوضح هذا القسم كيفية نقل البيانات التي تم تحليلها إلى قاعدة بيانات (SQLite).

أنشئ ملف JavaScript جديدًا للتفاعل مع قاعدة البيانات:

الآن، افتح الملف في محرر نصوص:

سنبدأ برنامجنا بالأكواد التالية:

هنا،

  • في السطر الأول، نقوم باستيراد وحدة fs .

  • في السطر الثالث، يحتوي المتغير filepath على مسار قاعدة بيانات SQLite.

  • في هذه المرحلة، قاعدة البيانات ليست موجودة بعد. ومع ذلك، ستكون ضرورية عند العمل مع node-sqlite3.

بعد ذلك، أضف الأسطر التالية لإنشاء اتصال بقاعدة بيانات SQLite:

هنا،

  • الدالة connectoToDatabase() تُنشئ اتصالاً بقاعدة البيانات.

  • داخل connectToDatabase()، نقوم باستدعاء existsSync() من وحدة fs داخل عبارة if. تتحقق عبارة if من وجود قاعدة البيانات في الموقع المحدد.

    • إذا كان تقييم الشرط هو true، فإن Database() فئة الخاصة بـ node-sqlite3 . بمجرد إنشاء الاتصال، ترجع الدالة كائناً وتخرج.

    • إذا كان تقييم الشرط هو false (قاعدة البيانات غير موجودة)، فسينتقل التنفيذ إلى كتلة else. هناك، Database() ستبدأ بوجود وسيطتين: مسار إلى ملف قاعدة البيانات ودالة استدعاء (callback).

بشكل أساسي، سيتم إنشاء قاعدة البيانات إذا لم تكن موجودة. ومع ذلك، في حال حدوث أي خطأ أثناء عملية الإنشاء، فسيتم تعيين كائن error وطباعة رسالة الخطأ.

بعد ذلك، سنقوم بتقديم الأكواد لإنشاء جدول إذا لم تكن قاعدة البيانات موجودة:

هنا،

  • تقوم connectToDatabase() باستدعاء دالة createTable() التي تقبل الكائنات المخزنة في db كوسيط.

  • خارج connectToDatabase()، قمنا بتعريف دالة createTable() التي تقبل كائن الاتصال db كمعلمة.

  • تأخذ طريقة exec() على db عبارة SQL كوسيط. وداخل عبارة SQL هذه، قمنا بتعريف إنشاء جدول migration بـ 7 أعمدة، حيث يتوافق كل عمود مع عناوين الأعمدة في ملف migration_data.csv .

  • أخيراً، نقوم باستدعاء connectToDatabase() وطريقة وتصدير كائن الاتصال الذي ترجعه حتى نتمكن من استخدامه في ملفات أخرى.

احفظ الملف وأغلق المحرر.

بعد ذلك، سنقوم بإنشاء برنامج آخر لإدراج البيانات التي تم تحليلها في قاعدة البيانات:

أدخل الكود التالي في insert_data.js:

هنا،

  • نقوم بتخزين كائن الاتصال الذي تم الحصول عليه من csv-to-sqlite3.js في المتغير db.

  • داخل رد النداء لحدث البيانات (المرفق بدفق وحدة fs)، نقوم باستدعاء serialize() على كائن الاتصال. تضمن هذه الطريقة انتهاء تنفيذ عبارة SQL واحدة قبل بدء العبارة التالية، مما يمنع حالات السباق في قاعدة البيانات (تشغيل النظام لعمليات متنافسة في نفس الوقت).

  • تقبل الـ serialize() ثلاثة وسائط:

    • الوسيط الأول هو عبارة SQL.

    • الوسيط الثاني هو مصفوفة.

    • الوسيط الثالث هو رد نداء (callback) يتم تشغيله عند إدراج البيانات بنجاح أو فشل إدراجها في قاعدة البيانات.

نحن جاهزون لتنفيذ البرنامج. قم بتشغيل insert_data.js باستخدام Node.js:

اعتمادًا على أداء النظام، قد تستغرق العملية بعض الوقت لتنتهي. ومع ذلك، عند الاكتمال، يجب أن يبدو المخرج مشابهًا لهذا:

الخطوة 5 – كتابة البيانات إلى CSV

بعد القسم الأخير، أصبح لدينا قاعدة بيانات تحتوي على جميع السجلات التي قمنا بتحليلها من migration_data.csv. في هذا القسم، سنقوم بقراءة البيانات من قاعدة البيانات وكتابتها في ملف CSV منفصل.

أنشئ ملف JavaScript جديدًا لتخزين البرنامج:

أولاً، أضف السطور التالية لاستيراد fs و csv-stringify  جنبًا إلى جنب مع كائن اتصال قاعدة البيانات من csv-to-sqlite3.js:

بعد ذلك، سنقوم بإضافة متغير يحتوي على اسم ملف CSV للكتابة إليه بالإضافة إلى مجرى قابل للكتابة:

هنا،

  • الـ createWriteStream() تأخذ اسم الملف المراد الكتابة إليه كمعامل. سنقوم بتسمية الملف saved_from_db.csv.

  • الـ column يخزن مصفوفة تحتوي على جميع أسماء الترويسة لبيانات CSV.

بعد ذلك، أضف أسطر البرمجة التالية لقراءة البيانات من قاعدة البيانات وكتابتها في saved_from_db.csv:

هنا،

  • نحن نستدعي الـ stringify() مع كائن كمعامل. ينتج عن ذلك مجرى تحويل (transform stream) يقوم بتحويل البيانات من كائن إلى تنسيق CSV. الكائن الممرر إلى stringify() له خاصيتان:

    • header: يقبل قيمة منطقية (Boolean). إذا كانت القيمة هي true، فسيتم إنشاء ترويسة.

    • columns: يقبل مصفوفة تحتوي على أسماء الأعمدة التي سيتم كتابتها في السطر الأول من ملف CSV إذا كان header هو true.

  • الـ each() من كائن الاتصال csv-to-sqlite3 يتم استدعاؤه بمعاملين: عبارة SQL (قراءة البيانات من قاعدة البيانات) ودالة استدعاء ذاتي (callback) (لمعالجة النجاح/الخطأ).

  • عند كل تكرار لـ each(), pipe() (من مجرى stringifier) يبدأ في إرسال البيانات على شكل أجزاء (chunks) إلى المجرى القابل للكتابة writableStream. ثم يتم كتابة كل جزء من البيانات في saved_from_db.csv.

  • عند كتابة جميع البيانات في ملف CSV، يتم طباعة رسالة نجاح على شاشة وحدة التحكم (console).

يجب أن يبدو الكود النهائي كما يلي:

احفظ الملف وأغلق المحرر. يمكننا الآن تشغيل البرنامج باستخدام Node.js:

لتأكيد ما إذا كان قد تم تصدير البيانات بنجاح، تحقق من محتوى saved_from_db.csv:

أفكار نهائية

في هذا الدليل، أوضحنا كيفية العمل مع ملفات CSV في Node.js باستخدام وحدات node-csv و node-sqlite3. لقد أنشأنا برامج متعددة لإنجاز مهام مختلفة، على سبيل المثال، تحليل البيانات من CSV، ودفع البيانات إلى قاعدة بيانات SQLite، وكتابة البيانات إلى ملف CSV جديد.

يوضح هذا الدليل جزءًا صغيرًا فقط من إمكانيات node-csv وحدة. تعرف على المزيد حول جميع ميزاتها في مشروع CSV. لمعرفة المزيد حول node-sqlite3، راجع الوثائق الرسمية على GitHub. وهناك وحدة أخرى تستحق الذكر وهي event-stream لتبسيط العمل مع التدفقات.

هل أنت مهتم بتطوير مشروع Node.js الخاص بك بشكل أكبر؟ إليك بعض البرامج التعليمية لـ Node.js التي يجب عليك الاطلاع عليها:

حوسبة سعيدة!

author

Preslav Dobrev

المؤلف · CloudSigma

Preslav Dobrev هو مصمم إبداعي في CloudSigma، يركز على هوية أعمال متسقة باستخدام قنوات التسويق التقليدية والمبتكرة. هو بارع في دمج الرؤية الفنية مع التسويق الاستراتيجي لخلق سرد قصصي مؤثر للعلامة التجارية.

التعليقات

لا توجد تعليقات بعد. كن أول من يعلق.