محوّل CSV ↔ JSON

حوّل CSV إلى مصفوفة كائنات JSON والعكس — يدعم الحقول المقتبسة وفواصل الفاصلة المنقوطة والتبويب، وكل ذلك داخل متصفحك.

1,108 مشاهدة

كيف يعمل التحويل فعليًا

يُمثّل CSV وJSON البيانات بطريقتين مختلفتين، والاتجاه الذي تحوّل فيه يحدّد مقدار التخمين المطلوب. تحويل CSV إلى JSON شبه آلي: يصبح سطر العناوين مجموعة المفاتيح، ويتحوّل كل سطر تالٍ إلى كائن واحد بتلك المفاتيح — فـ name,age فوق Ada,36 يصبح [{"name":"Ada","age":"36"}]. تُحلَّل الحقول المقتبسة التي تحتوي على فواصل، وعلامات الاقتباس المُهرَّبة ("")، والخلايا متعددة الأسطر وفق معيار RFC 4180، ويُكتشف الفاصل (فاصلة، أو فاصلة منقوطة، أو تبويب) تلقائيًا من السطر الأول.

أما الصعوبة الحقيقية فتكمن في تحويل JSON إلى CSV. فـ CSV بنية مسطّحة تمامًا — سطر واحد، سجل واحد، قيمة واحدة لكل خلية — بينما يدعم JSON بطبيعته التداخل: يمكن لكائن أن يحتوي على كائن آخر أو مصفوفة كقيمة لأحد حقوله، ولا توجد طريقة متفق عليها عالميًا لحشر ذلك في خلية CSV واحدة. خذ المثال {"name":"Ada","address":{"city":"London"}} — هل ينبغي تسمية العمود address.city (بترميز النقطة، أي تسطيح الكائن المتداخل إلى أعمدة إضافية)، أم ينبغي تضمين قيمة address بأكملها كنص JSON خام داخل خلية واحدة، مثل {"city":"London"}؟ يُستخدم كلا الأسلوبين في الواقع العملي، وليس أيّ منهما "المعيار" الوحيد؛ تعتمد هذه الأداة ترميز النقطة لمستوى واحد من التداخل، وتعود إلى تضمين نص JSON للمصفوفات والبُنى الأعمق، لأن ذلك يبقي الكائنات البسيطة صديقة لجداول البيانات فعليًا دون أن يفقد بيانات الكائنات المعقّدة بصمت.

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

ما يستحق معرفته

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

الأسئلة الشائعة

لماذا تحوّلت كل أرقامي إلى نصوص؟

لا يملك CSV أنواع بيانات — كل شيء نص. فعّل خيار "تحويل الأرقام" لتحويل القيم التي تبدو رقمية إلى أرقام JSON حقيقية (تبقى المعرّفات ذات الأصفار البادئة مثل "007" نصوصًا، لأن تحويلها كان سيفسدها بصمت).

ملف CSV من إكسل يستخدم الفاصلة المنقوطة — هل سيعمل؟

نعم — يُكتشف الفاصل من السطر الأول. تُصدّر إعدادات إكسل الإقليمية التركية والعديد من الإعدادات الأوروبية بفاصلة منقوطة، لأن الفاصلة تُستخدم فيها أصلًا كفاصل عشري.

ماذا عن JSON المتداخل؟

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

لماذا لا تختار هذه الأداة معيارًا واحدًا فقط لتسطيح JSON المتداخل؟

لأنه لا يوجد معيار واحد — تختلف النظم البيئية المختلفة فعليًا في ذلك. أعمدة ترميز النقطة (مثل address.city) تُبقي التداخل البسيط قابلًا للقراءة في جدول بيانات لكنها تُضاعف الأعمدة بسرعة؛ بينما تضمين القيمة المتداخلة كنص JSON خام يُبقي عمودًا واحدًا لكل حقل لكنه يتطلب إعادة تحليل تلك الخلية لاحقًا. تستخدم هذه الأداة ترميز النقطة للكائنات الضحلة وتعود إلى تضمين نص JSON للمصفوفات والتداخل الأعمق.

ماذا يحدث لمصفوفة داخل كائن أثناء التحويل من JSON إلى CSV؟

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

التعليقات

لا توجد تعليقات بعد — كن أول من يكتب تعليقًا!

أدوات مشابهة