تصل معظم ملفات CSV بشكل مُشوّش. تحتوي على خلايا فارغة حيث يجب أن تكون الخلايا الفارغة، واقتباسات غير متسقة، ولا توجد نمط مُفرض. التحويل إلى JSON النظيف ليس تغييرًا في التنسيق، بل هو مشكلة في تنظيف البيانات.
تغطي هذه المبادئ متى يجب الانتقال، وما يحدث أثناء التحويل، وكيفية التعامل مع الحالات الحدية بشكل صحيح - إما باستخدام مُحول CSV إلى JSON أو نصيّة مخصصة.
مقارنة CSV وJSON: التنازل الصريح
يُعدّ CSV مدمجًا، قابلًا للقراءة في جميع الأماكن، وسهل التصدير إلى جداول. بالنسبة للبيانات المسطحة - مثل صادرات قواعد البيانات، خطوط التحليل، السجلات المالية - فهو ما يناسبه. إذا كانت بياناتك تُعبّر عن صفوف وعمود دون تداخل، فإن CSV مناسب.
يصبح اختيار JSON أفضل عندما:
- تُحتوي بياناتك على تداخل أو تسلسل (مثلاً شخص له عناوين متعددة)
- تحتاج إلى معلومات نوعية (العدد 42 مقابل النص "42")
- أنت تُرسل البيانات إلى تطبيق أو تطبيق برمجي مكتوب باللغة JavaScript
- تريد تمثيل الخلايا الفارغة بشكل صريح، وليس مجرد خلية فارغة
التنازل ليس حول أي تنسيق أفضل. بل حول ما إذا كانت هيكل بياناتك يتجاوز ما يمكن تمثيله في CSV.
المشاكل التي يخلقها CSV
قبل التحويل، يجب أن تفهم ما هو مُعطل.
لا يوجد معيار لـ "الفارغ". يمكن أن يعني خلية فارغة في CSV "الفارغ"، أو "الصفر"، أو "النص الفارغ"، أو بيانات مفقودة. لا يمكن التعرف على ذلك من الملف. قد يعني عمود فارغ "مجهول" في نظام واحد و"0" في آخر. age الاقتباس غير المتسق.
يجب أن تُحيط القيم التي تحتوي على فواصل بعلامات تنصيص ( )، لكن ليس كل مُصدر يلتزم بالمواصفات. ستجد فواصل غير مُحيطَة، أو أقواس غير مطابقة، أو خلايا تفتح علامة تنصيص لكنها لا تُغلق."Portland, OR"مشاكل الترميز.
تُصل ملفات CSV غالبًا بـ BOM لـ UTF-8، أو أحرف Windows-1252، أو مزيج من كليهما. تُسبب أقواس ذكية، فواصل مُمَكّنة، والكثيرات المُسجّلة تُسبب توقفًا في مُحلّل يُتوقع أن يكون نظيفًا باللغة الإنجليزية. لا توجد معلومات عن النوع.
كل قيمة في CSV هي نص. العدد 42، القيمة المنطقية "صحيحة"، والرقم 2024-01-01 كلها مُخزنة كنص. التحويل الظاهري إلى JSON يُنتج وثيقة مليئة بالنصوص حيث كنت تتوقع أعدادًا وقيم منطقية. كيفية التحويل بشكل صحيح
الآليات بسيطة: كل صف في CSV يصبح كائنًا في JSON، مع عناوين الأعمدة كمفاتيح. المشكلة تكمن في كل ما يحدث قبل وبعد هذا التحويل.
التحويل إلى نوع معين.
يجب أن تصبح الأعمدة الممتلئة بقيم صحيحة كأعداد في JSON. يجب أن تصبح الأعمدة التي تحتوي على "صحيحة" أو "خاطئة" كقيم منطقية. لكن الأعمدة التي تبدو كأعداد (مثل 90210) يجب أن تبقى نصًا - التحويل يُدمّر الأصفار المُقدمة. التعامل مع الخلايا الفارغة.
يجب أن تُتخذ قرار: تحويلها إلى ، أو تجاهل المفتاح بالكامل، أو استخدام قيمة افتراضية. اختر واحدًا وكن متسقًا. nullالبيانات المفقودة.
إذا كان صف واحد يحتوي على عدد أقل من الأعمدة مقارنة بالعنوان، يجب أن يتعامل معه المُحلّل بذكاء - إما أن يملأها بـ أو يتجاهل الصف. null إليك نصيّة برمجية باللغة بايثون تتعامل مع الثلاثة:
تُزيل البُوم إذا وُجد.
import csv
import json
def coerce_value(value):
if value == '':
return None
try:
return int(value)
except ValueError:
pass
try:
return float(value)
except ValueError:
pass
if value.lower() in ('true', 'false'):
return value.lower() == 'true'
return value
def csv_to_json(csv_path, json_path):
with open(csv_path, encoding='utf-8-sig') as f: # utf-8-sig strips BOM
reader = csv.DictReader(f)
rows = []
for row in reader:
rows.append({k: coerce_value(v) for k, v in row.items() if k})
with open(json_path, 'w', encoding='utf-8') as f:
json.dump(rows, f, indent=2, ensure_ascii=False)
csv_to_json('input.csv', 'output.json')
ال utf-8-sig تُجرّب التحويل الرقمي بترتيب: عدد أولًا، ثم عدد عشري، ثم قيمة منطقية، ثم نص. أما coerce_value فإنها تُزيل الأعمدة الافتراضية الناتجة عن فواصل في عنوان الأعمدة. if k النماذج المُتداخلة من ملفات CSV المسطحة
لا يمكن لـ CSV تمثيل التداخل بشكل مباشر، لكن هناك طريقتين شائعتين.
مُلاحظة المفتاح المُقطعة.
تستخدم بعض صادرات CSV عناوين مثل . يُقسم خطوة ما على النقطة ويُبنى كائنات متداخلة: address.city و address.zipالتصنيف والانسجام.
def unflatten(row):
result = {}
for key, value in row.items():
parts = key.split('.')
d = result
for part in parts[:-1]:
d = d.setdefault(part, {})
d[parts[-1]] = value
return result
إذا تمثل عدة صفوف أطفالًا لذات الوالد (أوامر تحت أمر)، فقم بتصنيفها حسب معرف الوالد وبناء المصفوفة المتداخلة بعد التحويل. لا ينتمي أي من هذه الطرق إلى خطوة سريعة للتحويل - إذا كنت تفعل ذلك، فأنت تكتب نصيّة تحويل، وليس مجرد تغيير التنسيق. أي أداة يجب استخدامها
لـ ملف CSV نظيف وذو هيكل جيد فقط يحتاج إلى تغيير تنسيق: استخدم أداة عبر الإنترنت
. الصق، أعد التحويل، وانتهت. لا حاجة لتكوين، ولا اعتماد على مكونات. مُحول CSV إلى JSONلـ ملف CSV يحتوي على مشاكل معروفة - مثل مشاكل الترميز، أو الاقتباس غير المتسق، أو التحويل إلى نوع معين، أو الخلايا الفارغة - اكتب نصيّة. تتعامل النصيّة المذكورة أعلاه مع معظم الحالات الواقعية. يمكن استخدام بايدا (
) أيضًا، لكنها تتخذ قرارات تحويل مُستقلة قد لا تتوافق مع ما تريده.pd.read_csv() + df.to_json()لأوامر في السطر،
ميلر ) هو الطريق الأسرع: (mlrيتعامل ميلر مع الاقتباس، الترميز، والبيانات المفقودة بشكل صحيح من البداية. هو الطريق الأسرع من ملف CSV مشكل إلى JSON نظيف دون كتابة أي كود.
mlr --icsv --ojson cat input.csv > output.json
حالات حدود CSV وكيفية التعامل معها
مشكلة CSV
| ما يحصل في JSON | كيفية التعامل معها | خلية فارغة |
|---|---|---|
| أو مفتاح مفقود | null اتخذ قرارًا مبكرًا؛ وكن متسقًا في جميع الصفوف | نص مُشبه للعدد (رقم بريد) |
| يُفقد الأصفار المقدمة إذا تم التحويل | احتفظ به كنص؛ احذف التحويل فقط من الأعمدة التي تتحكم بها | فواصل في عنوان الأعمدة |
| مفتاح فارغ | على كل صف "" استخدم | عند بناء الكائنات if k بوم UTF-8 في بداية الملف |
| خطأ في التحليل أو | في المفتاح الأول افتح بـ | فواصل داخل خلية encoding='utf-8-sig' |
| تُوقف مُحلّل مبسط يحلل السطر بخطوة | استخدم مُحلّل CSV حقيقي، وليس | في عمود منطقي split(',') |
"true"/"false" نص، وليس | "true" منطقي true تحويل مُحدد بعد مقارنة بالحروف الصغيرة | التحول في التنسيق سهل. لكن البيانات ليست كذلك. |
يُعالج مُحول CSV إلى JSON الجزء الهيكلي في ثوانٍ. ما يستغرق الوقت هو فهم ما هو موجود في ملفك - الخلايا الفارغة، التحديات في الترميز، الأعمدة التي تبدو كأعداد لكنها ليست كذلك. اكتب تحويل الأنواع والتعامل مع الخلايا الفارغة بشكل صريح بدل الاعتماد على أداة تُفترض أنها تعرف، وستتجنب الأخطاء التي تظهر في البيانات الخاطئة التي تُعالج بشكل سري.
CSV إلى JSON: متى يجب التحويل وطريقة الحفاظ على نظافة البيانات 2
تثبيت ملحقاتنا
أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع
恵 وصلت لوحة النتائج!
لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!
