اذهب إلى المحتوى

السؤال

نشر

لدي محتوى نصي ضمن بالصيغة CSV تم فصل الأعمدة باستخدام الفاصلة (,) بالشكل التالي:

x,y,z,b
100,200,300,400
500,600,700,800
.....

وأرغب بتحويله إلى JSON بحيث يصبح بالشكل التالي:

{"x": 100,"y": 200,"z": 300,"b": 400},
{"x": 500,"y": 600,"z": 700,"b": 800},

بحيث تصبح كل قيمة من الأعمدة تقابل جميع القيم الأخرى. كيف يمكنني تحقيق ذلك؟

Recommended Posts

  • 1
نشر

يمكنك تحقيق ذلك عن طريق إستخدام الmodule المسمى بcsvtojson

ويمكنك الحصول عليه عن طريق تثبيته من خلال حزمة الادوات npm  من خلال هذا الأمر

npm install csvtojson

ولتقم بتحويل ملف csv الى json نفعل كالأتي

const csvParser=require("csvtojson");
csvParser().fromFile("ضع هنا مسار الملف").then(jsonFile=>doSomeThing(jsonFile))

وفي حالة كان ملف الcsv ضخم يمكنك تحويله عن طريق استخدام الstream وال pipe كما هو موضح فى المثال أدناه

csv()
  .fromStream(ضع هنا reference لstrem تقم بقراءة الملف)
  .subscribe(function(json){ //يجب عليك معالجة كل جزأ من الملف على حدة لأنه يصل من خلال الstreamعلى هيئة chunks
     return new Promise(function(resolve,reject){
         doSomeThing(json,function(){resolve()})
     })
  }) 

وللتوضيح, الفرق بين الكود بالأعلى وبالأدنى أن بالأعلى يتم قراءة الملف كله في الذاكرة ومن ثم تتم العملية عليه, بينما في المثال بالأدنى يتم قراءة الملف على هيئة اجزاء صغيرة ومعالجة كل جزأ منها على حدة حتى لا تمتلئ الذاكرة

  • 1
نشر

سنقوم بإدخال محتويات ملف CSV في مصفوفة ونقسم محتوى المصفوفة بناءً على المحدد delimiter. سيتم تحويل جميع صفوف CSV إلى كائنات JSON والتي ستتم إضافتها إلى المصفوفة الناتجة والتي سيتم تحويلها بعد ذلك إلى JSON وسيتم إنشاء ملف إخراج JSON مطابق:

// fs npm باستخدام حزمة csv  نقرأ ملف 
const fs = require("fs");
csv = fs.readFileSync("CSV_file.csv")
// تحويل البيانات إلى سلاسل نصية وتقسيمها في مصفوفة
var array = csv.toString().split("\r");
//والتي ستتم إضافتها لتنتج مصفوفة json إلى كائنات csv سيتم تحويل جميع صفوف
let result = [];
//headers  لذا نقوم بتخزينها في مصفوفة ال header على جميع أعمدة ال array[0] تحتوي 
let headers = array[0].split(", ")
//المتبقية n-1 نظرًا لأن الرؤوس مفصولة نحتاج إلى المرور على الصفوف
for (let i = 1; i < array.length - 1; i++) {
let obj = {}
// str إنشاء كائن فارغ لإضافة قيم الصف الحالي إليه لاحقًا. ونقوم بتعريف السلسلة
//s كقيمة مصفوفة حالية لتغيير المحدد وتخزين السلسلة التي تم إنشاؤها في سلسلة جديدة 
let str = array[i]
let s = ''
// بشكل افتراضي ، نحصل على القيم المفصولة بفواصل لخلية بين علامتي اقتباس "" لذلك نستخدم
//(") علامة لتتبع علامات الاقتباس ونقسم السلسلة وفقًا لذلك إذا واجهنا علامة اقتباس افتتاحية
//فإننا نحتفظ بالفواصل كما هي ، وإلا فإننا نستبدلها بـ أنبوب | نستمر 
//s في إضافة الأحرف التي ننتقل إليها إلى سلسلة
let flag = 0
for (let ch of str) {
	if (ch === '"' && flag === 0) {
	flag = 1
	}
	else if (ch === '"' && flag == 1) flag = 0
	if (ch === ', ' && flag === 0) ch = '|'
	if (ch !== '"') s += ch
}
// نقوم بتقسيم السلسلة باستخدام محدد الأنبوب وتخزين القيم في مصفوفة خصائص 
let properties = s.split("|")
// لكل رأس ، إذا كانت القيمة تحتوي على بيانات متعددة مفصولة بفواصل ، فإننا 
// نقوم بتخزينها في شكل مصفوفة وإلا يتم تخزين القيمة مباشرة 
for (let j in headers) {
	if (properties[j].includes(", ")) {
	obj[headers[j]] = properties[j]
		.split(", ").map(item => item.trim())
	}
	else obj[headers[j]] = properties[j]
}
// نضيف الكائن الذي تم إنشاؤه إلى مصفوفة النتائج الخاصة بنا 
result.push(obj)
}
//JSON  تحويل المصفوفة الناتجة إلى
let json = JSON.stringify(result);
fs.writeFileSync('output.json', json); // والتخزين يتم ضمن الملف الذي نحدده

 

  • 0
نشر

قم بإنشاء ملف read-file.js في مجلد مشروعنا الرئيسي و قم بتضمين الكود التالي لهذا الملف:

const csvjson = require('csvjson');
const readFile = require('fs').readFile;
readFile('./test-data.csv', 'utf-8', (err, fileContent) => {
    if(err) {
        console.log(err); // Do something to handle the error or just throw it
        throw new Error(err);
    }
    const jsonObj = csvjson.toObject(fileContent);
    console.log(jsonObj);
});

أولاً نقوم باستيراد التبعيات المطلوبة - حزمة csvjson الخارجية ووحدة نظام الملفات المضمنة (fs) (سنستخدم readFile فقط ، ولهذا السبب نتخذ هذه الطريقة فقط).
الجزء التالي من الكود هو المنطق الرئيسي. نقوم بتمرير ثلاث معلمات إلى وظيفة readFile: الأولى هي موقع ملف مصدر CSV الخاص بنا ، والثانية هي الترميز  وآخرها هي وظيفة رد الاتصال. هناك ، نتوقع تلقي معلمتين (خطأ إن وجد ومحتوى الملف الفعلي).

في حالة وجود خطأ أثناء قراءة الملف (يمكن أن يكون أحد الأسباب هو عدم وجود الملف يجب أن نكون مستعدين للقبض عليه والقيام بشيء ما به. 

في حالة عدم وجود خطأ ، فنحن على استعداد لتمرير المحتوى إلى مكتبة csvjson ، والتي ستقوم بتحليلها وإرجاع مجموعة من الكائنات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...