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

السؤال

نشر

مساعده عندي مشكله بالملف جيسون انا مخزن الداتا عليه بس المشكله كمثال السيرفر احيانن ينطفئ فابغي اخذ المعلومات الاخير الي كانت مخزنه بلملف "json" وبعدين يكمل يضيف معلومات جديد عليه مابغاه يشيل كل اشيئ كان موجود علي ملف الجيسون ويعيد يكتب الي علي Array كيف اسويه لاني حاولت اكثر من طريق وماعرفت..

         let currentPage = details.title;
         const dataFile = fs.readFileSync('data.json', 'utf8')
         if (dataFile === '') { // check if file json empty
           try {
              obj.table.push({name: details.title})
              let encodeJson = await JSON.stringify(obj);
              fs.writeFileSync("data.json", encodeJson)
              console.log('the file is empty so i pushed one data') 
           } catch(err) {
             console.log(err);
           }
         } else {
           //read data with JSON from file
           try {
           let decodeJson = await JSON.parse(dataFile);
           let values = decodeJson['table'].map(x => {return x['name']}) //create map JSON file
           if (values.includes(currentPage)) { // check if values is same Data on currentPage
             console.log('duplicate')
           } else {
             /*
             	أبغي استقبل المعلومات القديمه + اضافته بل Array وبعدين يضيف بعده معلومات جديد
             */
            obj.table.push({name: details.title}) //push data in array
            let encodeJson = await JSON.stringify(obj); // convert array to json
            fs.writeFileSync('data.json', encodeJson) // write in file lines JSON
           } 
           } catch (err) {
             console.log(err);
          }
        }

 

Recommended Posts

  • 0
نشر

يمكنك تحقيق المطوب باستبدال الطريقة writeFileSync ب appendFileSync.

  • writeFileSync تكتب على الملف من جديد وتحذف القديم
  • appendFileSync تبدأ بالكتابة من نهاية الملف الحالي

في حال أن البيانات لديك غير نصية، مما رأيته في الشيفرة أنك تخزنين ملف JSON 

ربما من الأفضل قراءة الملف القديم، ثم تخزينه في هيكلية Object ثم تعديلها ضمن السيرفر ثم في النهاية كتابة الملف من جديد (البيانات القديمة + الجديدة)

لايمكن عمل تعديلات سريعة على بنية الملف لأنه مكتوب على القرص الصلب،

الحل الأمثل للمشكلة هو في استخدام قواعد بيانات

  • 0
نشر (معدل)
بتاريخ 19 دقائق مضت قال Wael Aljamal:

ربما من الأفضل قراءة الملف القديم، ثم تخزينه في هيكلية Object ثم تعديلها ضمن السيرفر ثم في النهاية كتابة الملف من جديد (البيانات القديمة + الجديدة)

 

الصراحه سويته بكم مره بس مانجحت طريقه والمشكله يكرر لي اوبجيكت القديم مع الجديد ممكن كمثال افهم اكثر لو سمحت

تم التعديل في بواسطة Liwa Hadri
  • 0
نشر
بتاريخ 1 ساعة قال Liwa Hadri:

الصراحه سويته بكم مره بس مانجحت طريقه والمشكله يكرر لي اوبجيكت القديم مع الجديد ممكن كمثال افهم اكثر لو سمحت

عليك قراءة الملف لأول مرة و تخزينه ضمن Object يمكن عمل التعديلات عليه في الذاكرة و بعد كل تعديل على Object يمكن عمل witre له إلى التخزين في القرص كملف  (نقرا الملف مرة واحدة و نخزنه بشكل عام للتطبيق أي نشارك Object global نعدل عليه في الذاكرة ونكتب التعديلات عندما تدعونا الحاجة له)

 وليس append لأنها تضيف نص لنهاية الملف ولا تتعامل مع هيكلية معينة.

إن كان عدد التغييرات كبير فعليك التوجه لقواعد البيانات

  • 0
نشر (معدل)
بتاريخ 3 ساعات قال Wael Aljamal:

عليك قراءة الملف لأول مرة و تخزينه ضمن Object يمكن عمل التعديلات عليه في الذاكرة و بعد كل تعديل على Object يمكن عمل witre له إلى التخزين في القرص كملف  (نقرا الملف مرة واحدة و نخزنه بشكل عام للتطبيق أي نشارك Object global نعدل عليه في الذاكرة ونكتب التعديلات عندما تدعونا الحاجة له)

 

مافهمتك ممكن توضح لساتي مبتدئ بل الجيسون بس حسب ماعرفت انه اذا ماحبيت اتخلص من المعلومات قديمه لازم اتحصل علي القيم من الملف بعدين كمثال جربت كذا عشان ادخل معلومه بس تطبع لي مره واحد ؟ مو علي حسب التكرار باللوب 25 مره قصدي بس ليش

decodeJson.table.push({name : 'test'})

 

تم التعديل في بواسطة Liwa Hadri
  • 0
نشر
بتاريخ 7 دقائق مضت قال Liwa Hadri:

بس حسب ماعرفت انه اذا ماحبيت اتخلص من المعلومات قديمه لازم اتحصل علي القيم من الملف بعدين كمثال جربت كذا عشان ادخل معلومه بس تطبع لي مره واحد ؟ مو علي حسب التكرار باللوب 25 مره قصدي 


decodeJson.table.push({name : 'test'})

 

هل obj.table عبارة عن مصفوفة؟

هل يمكنك طباعة الكائن obj بالكامل لنعرف هيكليته.

الشيفرة لا يوجد بها مشكلة، ولكن أين الحلقة؟ وتأكدي أين تضيفين البيانات في الملف

  • ملاحظة: يمكنك فتح الملف في محرر الأكواد و تتبع تنفيذ البرنامج
  • 0
نشر (معدل)
بتاريخ 5 دقائق مضت قال Wael Aljamal:

هل obj.table عبارة عن مصفوفة؟

 

نعم بس هي خارج الفاكشن 

let obj = {
   table: []
};

اذا طبعت الـ obj بيعطني ليستات من الAPI الي خزنت عليه اسامي انميات:

{
  "table": [
    {
      "name": "Kimi ga Nozomu Eien"
    },
    {
      "name": "Kita e.: Diamond Dust Drops"
    },
    {
      "name": "Loveless"
    },
    {
      "name": "Blood+"
    },
    {
      "name": "Re: Cutey Honey"
    },
    {
      "name": "Solty Rei"
    },
    {
      "name": "Juuni Kokuki"
    },
    {
      "name": "Shaman King"
    },
    {
      "name": "X/1999"
    },
    {
      "name": "X"
    },
    {
      "name": "Mahou Sensei Negima!"
    },
    {
      "name": "Maria-sama ga Miteru"
    },
    {
      "name": "Boukyaku no Senritsu"
    },
    {
      "name": "Ima, Soko ni Iru Boku"
    },
    {
      "name": "Peace Maker Kurogane"
    },
    {
      "name": "Pita Ten"
    },
    {
      "name": "Power Stone"
    },
    {
      "name": "Mononoke Hime"
    },
    {
      "name": "RahXephon"
    },
    {
      "name": "Samurai 7"
    },
    {
      "name": "Scrapped Princess"
    },
    {
      "name": "s.CRY.ed"
    },
    {
      "name": "Shingetsutan Tsukihime"
    },
    {
      "name": "Slam Dunk"
    },
    {
      "name": "Strange Dawn"
    }
  ]
}

الفكره انا كنت ابغاه مايشيل المعلومات من الجيسون اذا السيرفر مثال انطفئ فابغي المعلومات قديمه تضل بلجيسون ويضل يضيف معلومات الثانيه الي هي ( جديد) عشان بعدين أنا بسوي فحص اذا فيه Duplicate" بل اسامي اوبجيكت مايضيفهم

ذا الكود جديد عدلت عليه + اني اجرب بملف الجيسون اذا اقدر اطبع الكلمه test 25 مره

  do {
    await timer(1500);
    i++;
    console.log(i);
    if (i === page_number) { // check if index reached last page
      i=1
    }
    fs.writeFile('saveindex.txt', i, (err2) => {
      if (err2) throw console.log(err2);
    });
    let pageID = await fetch('https://api.jikan.moe/v4/anime?page='+i); // كل صفحه واحد تحتوي علي 25 مصفوف
    let getAnimes = await pageID.json()
    if (getAnimes.data) {
       getAnimes.data.forEach(async details => {
         let currentPage = details.title;
         const dataFile = fs.readFileSync('data.json', 'utf8')
         if (dataFile === '') { // check if file json empty
           try {
              obj.table.push({name: details.title})
              let encodeJson = await JSON.stringify(obj);
              fs.writeFileSync("data.json", encodeJson)
              console.log('file is empty') 
           } catch(err) {
             console.log(err);
           }
         } else {
           //read data with JSON from file
           try {
           let decodeJson = await JSON.parse(dataFile);
             decodeJson.table.push({name : 'test'})
            console.log(decodeJson); // جربت هنا طبعت اذا بيطبع لي test 25 مره ولا بس مادري ليش طبع لي مره واحد
            //fs.writeFileSync('data.json', JSON.stringify(obj))
           } catch (err) {
             console.log(err);
          }
        }
      })
    }
  } while(i<=page_number);

 

تم التعديل في بواسطة Liwa Hadri
  • 0
نشر
بتاريخ الآن قال Wael Aljamal:

ما هي قيمة page number

اعتقد اخر الصفحه الي موجود بل API الي هي رقم 990 شيئ كذا اعتقد

  let response = await fetch('https://api.jikan.moe/v4/anime');
  let data = await response.json()
  page_number = data.pagination.last_visible_page

 

  • 0
نشر
بتاريخ 4 دقائق مضت قال Liwa Hadri:

اعتقد اخر الصفحه الي موجود بل API الي هي رقم 990 شيئ كذا اعتقد

أرجو تعديل الملف للشكل:

setInterval(function () {
  element.innerHTML += "Hello"
}, 1000);

أي:

setInterval(function () {

  i++;
  console.log(i);
  if (i === page_number) { // check if index reached last page
    i=1
  }
  fs.writeFile('saveindex.txt', i, (err2) => {
    if (err2) throw console.log(err2);
  });
  let pageID = await fetch('https://api.jikan.moe/v4/anime?page='+i); // كل صفحه واحد تحتوي علي 25 مصفوف
  let getAnimes = await pageID.json()
  if (getAnimes.data) {
    getAnimes.data.forEach(async details => {
      let currentPage = details.title;
      const dataFile = fs.readFileSync('data.json', 'utf8')
      if (dataFile === '') { // check if file json empty
        try {
          obj.table.push({name: details.title})
          let encodeJson = await JSON.stringify(obj);
          fs.writeFileSync("data.json", encodeJson)
          console.log('file is empty') 
        } catch(err) {
          console.log(err);
        }
      } else {
        //read data with JSON from file
        try {
          let decodeJson = await JSON.parse(dataFile);
          decodeJson.table.push({name : 'test'})
          console.log(decodeJson); // جربت هنا طبعت اذا بيطبع لي test 25 مره ولا بس مادري ليش طبع لي مره واحد
          //fs.writeFileSync('data.json', JSON.stringify(obj))
        } catch (err) {
          console.log(err);
        }
      }
    })
  }
}, 1500);
  • 0
نشر
بتاريخ الآن قال Wael Aljamal:

أرجو تعديل الملف للشكل:


setInterval(function () {
  element.innerHTML += "Hello"
}, 1000);

أي:


setInterval(function () {

  i++;
  console.log(i);
  if (i === page_number) { // check if index reached last page
    i=1
  }
  fs.writeFile('saveindex.txt', i, (err2) => {
    if (err2) throw console.log(err2);
  });
  let pageID = await fetch('https://api.jikan.moe/v4/anime?page='+i); // كل صفحه واحد تحتوي علي 25 مصفوف
  let getAnimes = await pageID.json()
  if (getAnimes.data) {
    getAnimes.data.forEach(async details => {
      let currentPage = details.title;
      const dataFile = fs.readFileSync('data.json', 'utf8')
      if (dataFile === '') { // check if file json empty
        try {
          obj.table.push({name: details.title})
          let encodeJson = await JSON.stringify(obj);
          fs.writeFileSync("data.json", encodeJson)
          console.log('file is empty') 
        } catch(err) {
          console.log(err);
        }
      } else {
        //read data with JSON from file
        try {
          let decodeJson = await JSON.parse(dataFile);
          decodeJson.table.push({name : 'test'})
          console.log(decodeJson); // جربت هنا طبعت اذا بيطبع لي test 25 مره ولا بس مادري ليش طبع لي مره واحد
          //fs.writeFileSync('data.json', JSON.stringify(obj))
        } catch (err) {
          console.log(err);
        }
      }
    })
  }
}, 1500);

تمام بس ليش ماستخدم while بدل setInterval؟ + ممكن تساعدني في الاوبجيكت الجيسون ابغاه يحفظ ال بيانات قديم تضل اذا طفي سيرفر ومثال اذا شغلتو مره ثانيه يرجع المعلومات قديمه + يضل يضيف المعلومات الجديد

  • 0
نشر
بتاريخ 40 دقائق مضت قال Liwa Hadri:

تمام بس ليش ماستخدم while بدل setInterval؟ + ممكن تساعدني في الاوبجيكت الجيسون ابغاه يحفظ ال بيانات قديم تضل اذا طفي سيرفر ومثال اذا شغلتو مره ثانيه يرجع المعلومات قديمه + يضل يضيف المعلومات الجديد

setInterval تستدعي نفسها كل مدة زمنية أي نفس الحلقة.

جربت تنفيذ الفكرة على بيانات بسطية ثم توسيع اامنطق ليشمل الاتصال عن طريق api

  • 0
نشر (معدل)
بتاريخ 23 دقائق مضت قال Wael Aljamal:

setInterval تستدعي نفسها كل مدة زمنية أي نفس الحلقة.

جربت تنفيذ الفكرة على بيانات بسطية ثم توسيع اامنطق ليشمل الاتصال عن طريق api

اوك فهمتك بس اشلون احل المشكله حقت الجيسون لاني تعبت صراحه يومين وانا جالس احله بس ماقدرت اذا يمديك تساعدني بالله

تم التعديل في بواسطة Liwa Hadri
  • 0
نشر
بتاريخ 40 دقائق مضت قال Liwa Hadri:

اوك فهمتك بس اشلون احل المشكله حقت الجيسون لاني تعبت صراحه يومين وانا جالس احله بس ماقدرت اذا يمديك تساعدني بالله

أرجو إرفاق كامل الملفات لأستطيع التجريب لدي

اضغط مجلد المشروع ك rar او zip وارفقه في تعليق

  • 0
نشر (معدل)
بتاريخ 19 دقائق مضت قال Wael Aljamal:

أرجو إرفاق كامل الملفات لأستطيع التجريب لدي

اضغط مجلد المشروع ك rar او zip وارفقه في تعليق

 

script.rar


سويته بطريقتي كذا مادري اذا هي صح ولا يعني اذا اتقفل مثال سكريبت واشتغل مره ثاني بيرجع بيكتب القيم مره ثاني بلملف جيسون -> يقفل المتغير -> بعدين يضل يضيف عناصر الجديد

let autoSave = true; برا الفاكشن


if (autoSave === true) { // يحط القيم اذا كان المتغير شغال
		decodeJson.table.forEach(e => {
		obj.table.push(e);// يحط الاوبجيكتات الي كانت علي الملف الجيسون
		autoSave = false; // يقفل المتغير
	});
}
obj.table.push({name: details.title}); // يضل يحط اوبجيكتات الجديد علي الملف الجيسون
تم التعديل في بواسطة Liwa Hadri
  • 0
نشر
بتاريخ 11 ساعات قال Liwa Hadri:

سويته بطريقتي كذا مادري اذا هي صح ولا يعني اذا اتقفل مثال سكريبت واشتغل مره ثاني بيرجع بيكتب القيم مره ثاني بلملف جيسون -> يقفل المتغير -> بعدين يضل يضيف عناصر الجديد



 

جرب التالي

ggg.jpg

data.json

saveindex.txt

script.js

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...