تخطَّ إلى المحتوى

تحويل CSV إلى JSON

حوّل ملف CSV أو جدولًا ملصقًا إلى JSON نظيف — أرقام وقيم منطقية بأنواعها الصحيحة، وكائنات متداخلة مبنية من العناوين المنقّطة، والشكل الذي تتوقعه شيفرتك بالضبط.

  • لا يُخزَّن أبدًا
  • لا طابور ولا انتظار
  • دون تسجيل ودون علامة مائية

كيف تعمل الأداة

1

أضِف CSV

أفلِت ملف .csv أو .tsv، أو الصق البيانات. يُكتشف الفاصل والترميز تلقائيًا.

2

اختر الشكل

مصفوفة كائنات، أو مصفوفة مصفوفات، أو كائن مفاتيحه من العمود الأول، أو JSON Lines — بالإضافة إلى الأنواع والقيم الفارغة والمسافات البادئة.

3

انسخ أو نزّل

انسخ JSON إلى الحافظة أو احفظه كملف .json.

حيث يكون CSV أكثر غموضًا مما يبدو

لا يوجد لـ CSV معيار حقيقي — هناك مواصفة استرشادية من عام 2005 تصف ما تفعله معظم الأدوات، وقدر كبير من البرامج يفعل شيئًا آخر. لذا فالمهمة الأولى هي معرفة حقيقة الملف: هل تفصل القيم فواصل أم فواصل منقوطة أم علامات جدولة (الإعدادات الإقليمية الأوروبية تصدّر فواصل منقوطة، لأن الفاصلة هي فاصلها العشري)، وهل الصف الأول صف عناوين، وكيف يُعالَج الاقتباس. فالحقل المقتبس يمكن أن يحتوي نظاميًا على فواصل وأسطر جديدة وعلامات اقتباس مضاعفة، ولهذا يُعدّ التقسيم عند الفواصل طريقة خاطئة لقراءته، ولهذا يُفسد المحلل الساذج أي ملف يحتوي على عنوان بريدي.

والأنواع هي المهمة الثانية، ولـ JSON قواعد لا يعرفها CSV. فخلية CSV تحتوي على نص ولا شيء غيره؛ أما JSON فيميّز بين الأرقام والنصوص والقيم المنطقية وnull. ولا بد أن يقرر شيء ما أيها أي، والقرارات المهمة هي التي قد تسوء: الصفر البادئ له معنى في الرمز البريدي أو رقم الهاتف أو مرجع الحساب، لذا يجب أن تبقى قيمة مثل 01234 نصًا بدل أن تصبح الرقم 1234. وينطبق الأمر نفسه على المعرّفات الطويلة، التي تفقد دقتها كأرقام JSON بعد نحو تسعة كوادريليونات.

تبقى التواريخ كالنص الذي كانت عليه، لأن JSON لا يملك نوعًا للتاريخ. فالقيمة 2024-03-05 تخرج كالنص "2024-03-05"، وهذه هي الإجابة الصادقة لا قيدًا — فالبديل هو التخمين، والتخمين هو ما يجعل 03/05/2024 يعني مارس في بلد ومايو في بلد آخر. وتحويلها قرار يعود إلى البرنامج الذي يستهلك JSON، فهو يعرف الصيغة التي يريدها.

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

عندما تحتاج إلى شيء آخر

للملفات الأكبر من أن تتسع لها الذاكرة، أو لأي عمل عبر السكربتات، صُمّم csvkit لهذا الغرض تحديدًا: يحوّل csvjson --stream data.csv الملف تدريجيًا، ويتيح لك csvlook رؤية ما لديك أولًا، ويصلح csvclean الصفوف غير المنتظمة التي تُفسد كل ما بعدها. أما Miller — mlr --icsv --ojson cat data.csv — فيفعل الشيء نفسه بسرعة كبيرة ويتعامل مع JSON المفصول بالأسطر، وهو ما تريده معظم مسارات البيانات فعلًا.

وحين تكون الأنواع أهم من السهولة، أجرِ التحويل بالشيفرة مع إعلان الأنواع بدل استنتاجها. فمكتبة pandas في Python مع تعيين dtype صريح، أو سكربت صغير بمخطط، يعني أن الرمز البريدي يبقى رمزًا بريديًا والمعرّف يحتفظ بكل أرقامه — وهو ما لا يستطيع أي استنتاج تلقائي ضمانه في ملف لم يرَه كله.

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

أي شكل JSON أختار؟

مصفوفة الكائنات — [{"name": "Ada", "age": 36}] — تناسب كل واجهة برمجة ومكتبة تقريبًا. ومصفوفة المصفوفات هي الأكثر إيجازًا. والكائن ذو المفاتيح يتيح للشيفرة البحث عن السجلات بالمعرّف. أما JSON Lines فيضع سجلًا واحدًا في كل سطر، لأدوات التدفق وBigQuery ومسارات معالجة السجلات.

كيف تُحدَّد الأرقام والقيم المنطقية؟

مرة واحدة لكل عمود: لا يصبح العمود أرقامًا إلا إذا كانت كل قيمة فيه رقمًا، فلا يختلط "007" و7 أبدًا تحت مفتاح واحد. والقيم ذات الأصفار البادئة، والمعرّفات الأطول من أن يحملها JavaScript بدقة، تبقى نصوصًا. وتصبح true وfalse قيمًا منطقية، وتصبح الخلايا الفارغة null — أو نصوصًا فارغة، أو تُحذف، كما تفضّل.

هل يستطيع إنشاء JSON متداخل؟

نعم. عند تفعيل التداخل، يصبح عنوان مثل address.city هو {"address": {"city": …}}، وتصبح tags.0 وtags.1 مصفوفة.

هل تُخزَّن بياناتي في أي مكان؟

لا. لا يُرسل أي شيء إلى أي مكان ولا يُخزَّن أي شيء.

وماذا عن الفواصل المنقوطة وعلامات الجدولة والترميزات الأخرى؟

تُكتشف الفواصل والفواصل المنقوطة وعلامات الجدولة والأشرطة العمودية تلقائيًا، وكذلك UTF-8 وUTF-16 وترميزات Windows الأقدم، فيصل النص ذو الأحرف المشكّلة وغير اللاتينية سليمًا.

وماذا عن أسماء الأعمدة المكررة أو الفارغة؟

تحصل الأسماء المكررة على رقم (name وname_2)، وتحصل العناوين الفارغة على اسم مبني على موضعها (column_3)، فلا تُستبدل أي قيمة، وتُبلَّغ بما تغيّر.

معلومة مفيدة: تبقى التواريخ كالنص الموجود في ملفك، لأن JSON لا يملك نوعًا للتاريخ. والملفات الكبيرة جدًا محدودة بذاكرة متصفحك.

أضِف هذه الأداة إلى موقعك

مجانية لأي مدونة أو صفحة فصل دراسي أو مقالة مساعدة. الصق مقتطفًا واحدًا وسيتمكن زوارك من استخدامها مباشرةً على صفحتك.