ما هي أسرع طريقة لاستبدال السلاسل النصية باستخدام تعبيرات نمطية متعددة في مليون مشاركة؟

بعد استيراد vBulletin، أحتاج إلى إصلاح العديد من الأشياء في الرسائل المستوردة.

أحتاج إلى تعديل أو استبدال أو حذف الكثير من وسوم BBcode القديمة.

لقد راجعت هذا الرابط: Replace a string in all posts

أنا بالتأكيد لا أريد ارتكاب أي أخطاء نظرًا لأن لدي 1.6 مليون منشور.

  1. هل توجد طريقة لاستهداف منشور واحد محدد لإجراء بعض الاختبارات قبل استبدال السلاسل في جميع المنشورات؟
    لقد أنشأت منشورًا “اختباريًا” في منتداي يحتوي على مجموعة من وسوم BB في سياقات مختلفة.

  2. كم من الوقت سيستغرق استبدال السلسلة في أكثر من مليون منشور؟
    إذا استغرق الأمر وقتًا طويلاً، فهل توجد طريقة أسرع؟ ربما عن طريق تعديل النصوص مباشرة في قاعدة البيانات؟

  3. هل توجد طريقة لإجراء عمليات استبدال متعددة في وقت واحد (على سبيل المثال، إضافة أسطر جديدة قبل وبعد وسوم [quote]، واستبدال [b] و [i] بـ ** و *، وإزالة [color] و [indent]، وما إلى ذلك)؟

تعديل: هل سيكون تطبيق هذه التعديلات على محتوى المنشور الخام عبر Rails ثم إعادة تشكيل جميع المنشورات هو الحل المناسب؟

أبحث عن نفس الحل أيضًا.

مرحبًا @Canapin

معلومة من تجربتنا بعد ترحيل 1 مليون منشور من vB3 إلى Discourse قبل حوالي ستة أشهر:

عندما قمنا بالترحيل من vB، أجرينا جميع عمليات تنظيف البيانات وإعادة هيكلة وسوم bbcode باستخدام كود Ruby مخصص بكثرة في سكريبت الترحيل.

وجدنا أن هذا النهج كان الأفضل لنا؛ حيث قمنا بتنظيف كل شيء بتشغيل العديد من تعبيرات REGEX باستخدام دالة gsub في Ruby على منشورات vB قبل إدراجها في قاعدة بيانات Discourse.

وإلا، ستحتاج إلى تشغيل العديد من استعلامات PostgreSQL مرة أخرى على منشورات Discourse الخام وإعادة طهي المنشورات.

بعد اختبارات مكثفة، قررنا إجراء جميع عمليات المعالجة المسبقة أثناء الترحيل (وليس بعد الترحيل). وجدنا أن هذه هي الطريقة “الأسرع” لإكمال ترحيل مثالي.

أتمنى أن يكون ذلك مفيدًا.

هل تعرف إذا كان هناك طريقة لإعادة استيراد المنشورات فقط دون التأثير على بيانات Discourse التي تم استيرادها بالفعل، وخاصة البيانات المرتبطة بمعرفات المنشورات (المستخدمين، المواضيع، المرفقات، الروابط الدائمة، إلخ)؟

تستغرق عملية الاستيراد وقتًا طويلاً لدرجة أنه إذا نسيت شيئًا ما وكان عليّ إعادة استيراد كل شيء من جديد، فستستغرق العملية أيامًا أخرى.

عندما كان السكربت يستورد المنشورات، كان ينشئ حوالي 50,000 منشور في Discourse في الساعة. لماذا تستغرق عملية إعادة التحضير (rebake) وقتًا أطول بكثير؟

مرحبًا @Canapin

أفهم ألمك تمامًا. بعد هجرتنا الأصلية، قمنا بكتابة الكثير من كود Ruby المخصص لتنظيف أكثر من عقد من النصوص المنسوخة والمُلصَقة من كل زاوية في العالم؛ ناهيك عن جميع مشاكل الترميز (mojibake) ومجموعات الأحرف الغريبة؛ ناهيك عن جميع أكواد bbcode المتنوعة والمتداخلة التي تطلبت الكثير من معالجة Ruby لتنظيفها بشكل أنيق أثناء الهجرة.

كان الأمر غير تافهًا وأخذ وقتًا طويلًا (ومحاولات هجرة لا تحصى)؛ لكننا كنا / لا نزال في المقام الأول منتدى مخصص للبرمجة، لذا إذا كان منتدى معظمه نصوصًا فقط (وليس أكوادًا)، فستكون العملية أكثر وضوحًا.

اضطر فريقنا إلى كتابة الكثير من تعبيرات REGEX “المعقدة نوعًا ما للهروب من هذا وذاك”؛ لأن تحويل كل تلك أكواد bbcode المتداخلة القديمة إلى Markdown ليس بالأمر التافه عندما ينشر الناس الكثير من أكواد bbcode المتداخلة على مر السنين. كما قمنا بإزالة الكثير من أكواد bbcode التي اعتقدنا أنها تضيف قيمة قليلة بعد سنوات من نشرها.

للإجابة على سؤالك الأصلي أعلاه:

نعم، يمكنك ببساطة تعليق الأسطر (comment out) التي ترغب في تخطيها في نص الهجرة.

في الواقع، قمنا بإعادة كتابة جزء كبير من أساليب الهجرة، لكنها كانت نقطة انطلاق ممتازة ومفيدة للغاية، خاصةً أن هجرة vB3 كانت ولا تزال غير مدعومة.

أعلم ذلك، لكن إذا قمت بتشغيل سكريبت الهجرة ببساطة، فسيتم تخطي المنشورات الموجودة مسبقًا.

إذا قمت بحذف جميع منشورات Discourse المستوردة قبل إعادة تشغيل الهجرة، فأنا أفترض أن إعادة استيرادها سيعطي معرفًا مختلفًا (معرف منشور Discourse) عن الهجرة السابقة، ومن المرجح أن تنكسر جميع الروابط المرجعية لهذه المنشورات.

نعم، هناك طرق عديدة لـ “تقشير هذه القطة”، كما يقولون.

أنا سعيد جدًا لأننا اضطررنا للقيام بذلك مرة واحدة فقط في حياتنا وأن الأمر قد انتهى!

:slight_smile:

إذا كان ذلك ممكنًا على الإطلاق، فسيكون من الأسهل بكثير بكثير أن يقوم المستورد بإصلاح تلك الأمور. إذا كنت قد بدأت بالفعل في التشغيل، فسيكون الأمر طويلاً ومؤلمًا. يمكنك محاولة إنشاء سكريبت استيراد يقوم بتعديل المنشورات التي تم استيرادها بالفعل، لكنني لا أعرف أي نماذج لكيفية القيام بذلك.

إذن، أعتقد أنني سأقوم بتعديل أداة الاستيراد لتنفيذ تعبيراتي النمطية قبل الاستيراد، وسأكون صبورًا قدر الإمكان بعد ذلك!

شكرًا لردودكم.