الانتقال إلى المحتوى الرئيسي
PulsarKit

تنظيف ملف CSV من مشكلات ترميز Windows-1251 وعلامة BOM قبل استيراده

ملف CSV مُصدَّر يبدو عاديًا تمامًا حين تفتحه في جدول بيانات، ومع ذلك قد يفسد استيراد JSON بسبب حرف غير مرئي أو ترميز خاطئ.

بقلم PulsarKit · ·

قد يبدو الملف سليمًا تمامًا وهو يحمل ترميزًا خاطئًا

ملف CSV المُصدَّر من برامج المحاسبة أو قواعد البيانات القديمة كثيرًا ما لا يكون بترميز UTF-8 أصلًا. فما زال ترميز Windows-1251 للنصوص السيريلية وترميز Windows-1252 للأحرف الأوروبية الغربية ذات العلامات شائعين في مخرجات أنظمة بُنيت قبل سنوات. وبرنامج جداول البيانات يعرض مثل هذا الملف غالبًا دون أي اعتراض، لأنه يطبّق تلقائيًا تخمينه الخاص للترميز. لذلك يبدو الملف عاديًا إلى أن يقرأه شيء أقل تساهلًا، كسكربت أو سلسلة استيراد أو أداة تحميل لقاعدة البيانات. هذا القارئ يفترض أن الملف بترميز UTF-8، فيحصل على كتلة من الرموز المشوهة بدل النص الذي كان فيه.

علامة من ثلاثة بايتات في بداية الملف قد تعطّل المحلل الصارم

علامة ترتيب البايتات (BOM) في UTF-8 علامة غير مرئية، طولها ثلاثة بايتات فقط، تقع في أول الملف تمامًا لتشير إلى أن النص الذي يليها بترميز Unicode. وهي مفيدة لبرنامج مثل Excel يبحث عنها. لكنها تصبح مشكلة حين تكون الوجهة أداة استيراد JSON صارمة أو سكربتًا لا يتوقعها. فهذه البايتات الزائدة تلتصق بأول حرف من عنوان العمود الأول، فلا يعود العمود الذي يُفترض أن اسمه «id» يطابق هذا الاسم في أي موضع يتوقعه فيه بقية الكود. واكتشاف هذه العلامة وإزالتها قبل التحويل، بدل تركها في الملف الناتج، يمنع عدم تطابق يصعب تتبع مصدره بعد وقوعه.

الحصول على الترميز الصحيح تلقائيًا، دون قائمة من الخيارات

الكشف الموثوق عن الترميز، وهو ما تجريه أداة CSV إلى JSON قبل قراءة أي صف، يبحث أولًا عن علامة ترتيب البايتات. ثم يحاول التحقق من بقية البايتات بصرامة على أنها UTF-8، ولا يلجأ إلى Windows-1251 أو Windows-1252 إلا إذا فشل هذا التحقق، ويختار بينهما حسب توزيع البايتات ذات القيم العالية. وهذا الترتيب مهم. فالملف الذي هو بترميز UTF-8 أصلًا لا يُشكَّك فيه أبدًا فيُقرأ خطأً على أنه شيء آخر، أما الملف الذي ليس بترميز UTF-8 فيُتعرَّف عليه بدقة بدل أن يُفرض عليه UTF-8 فيتحول نصه إلى رموز مشوهة في الطريق. والكشف نفسه يسبق أداة CSV إلى Excel، للحالات التي تكون فيها الوجهة جدول بيانات لا سكربتًا.

أنواع البيانات لا تقل أهمية عن ترميز الأحرف

ضبط ترميز الأحرف يحل نصف ما يتعطل أثناء تحويل CSV إلى JSON فقط. والنصف الآخر هو تحديد القيم التي يجب أن تصبح أرقامًا أو قيمًا منطقية في JSON، والقيم التي يجب أن تبقى نصًا عاديًا. فقيمة مثل 00123 تتحول إلى الرقم 123 تفقد صفرها البادئ إلى الأبد لحظة حدوث هذا التحويل. والمعرّف الذي يزيد طوله على نحو خمسة عشر رقمًا يُقرَّب لحظة أن يصبح رقمًا عشريًا عائمًا قياسيًا بدل أن يبقى نصًا. وكلاهما يجب أن يبقى سلسلة نصية، لأن تحويلهما يغيّر البيانات نفسها، لا تنسيقها أو مظهرها فحسب.

عنوان مكرر واحد قد يعطّل الاستيراد بطريقة تختلف عن الترميز الخاطئ

لا يمكن لكائن JSON أن يحمل خاصيتين بالمفتاح نفسه. فالملف المصدر الذي فيه عمودان يتشاركان اسم العنوان نفسه، وهذا ليس نادرًا في الملفات المُصدَّرة المجمّعة من أكثر من نظام، يحتاج إلى إعادة تسمية هذه العناوين المكررة بأسماء مختلفة أثناء التحويل. وإلا فإن بيانات العمود الثاني تكتب فوق بيانات الأول في كل كائن ناتج، دون أي تحذير. هذا نمط فشل مستقل عن الترميز وعن أنواع القيم، لكنه قادر مثلهما على إفساد الاستيراد بصمت. ومن المفيد التأكد من أن أداة التحويل تُبلغ عن ذلك حين يحدث بدل أن تحل التعارض بشكل خفي، وتمرير النتيجة إلى أداة تنسيق JSON يكشف المفاتيح المعاد تسميتها من النظرة الأولى.

خطوة بخطوة: فحص الملف قبل أن يدخل إلى الاستيراد

حوّل الملف المُصدَّر مرة واحدة في أداة CSV إلى JSON مع ترك الفاصل والترميز على الوضع التلقائي، ثم افحص التخمينين كليهما: أرسل النتيجة إلى أداة تنسيق JSON، وهي من الخطوات التالية التي تعرضها الصفحة، واقرأ أول بضعة سجلات. الأحرف السيريلية المشوهة أو العلامات المكسورة على الأحرف تعني أن تخمين الترميز كان خاطئًا. أما مفتاح واحد طويل ما زالت الفواصل بداخله فيعني أن تخمين الفاصل هو الخاطئ. اضبط الخيار الخاطئ يدويًا وحوّل مرة أخرى: قائمة الترميز تعرض Windows-1251 وWindows-1252 وUTF-8 مع علامة BOM أو بدونها وUTF-16 LE، وقائمة الفاصل تعرض الفاصلة والفاصلة المنقوطة وعلامة الجدولة والخط العمودي أو حرفًا تختاره بنفسك. والملف الذي لا يمكن فهم فاصله أو ترميزه إطلاقًا يُرفض برسالة توضيحية بدل أن يُحوَّل إلى كلام بلا معنى.

بعد ذلك حدّد كيف تُعامَل أنواع القيم: الإعداد الافتراضي يُبقي القيم ذات الصفر البادئ والمعرّفات الطويلة نصًا. وفي ملف مؤلف من رموز أو أرقام هواتف أو أرقام حسابات، ضبط «أنواع القيم» على «إبقاء الكل نصًا» يعني ألا يُحوَّل أي شيء على الإطلاق. وما دامت النتيجة مفتوحة في أداة تنسيق JSON، ابحث عن أثرين يدلان على مصدر غير مرتب: عمودان عنوان كل منهما id يظهران باسمي id وid_2، والصف الذي فيه حقول أكثر من العنوان يحمل الحقول الزائدة تحت المفتاح __extra. وإصلاح الأمرين في الملف المصدر أرخص من إصلاحهما في النظام الذي سيتعثر بهما لاحقًا. ويمكن معالجة حتى عشرين ملفًا، بحجم إجمالي 300 ميغابايت، دفعة واحدة دون مغادرة علامة التبويب في المتصفح.

الأدوات المستخدمة في هذه المقالة

اقرأ أيضًا