data · 7 دقائق قراءة

CSV بلا معيار، ولهذا يتعطّل ملفّك

أبسط صيغة بيانات في العالم، ومع ذلك يختلف برنامجان على ما يقوله ملفّك.

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

جاء RFC 4180 عام 2005 يصف الممارسة الشائعة. فهو وثيقة إعلامية لا معيارًا يلزم أحدًا اتّباعه، أي أنه يوثّق عرفًا لا ينشئ واحدًا — وتتجاهله بانتظام برامج أقدم منه.

أولًا: الفاصل ليس فاصلة دائمًا

في كثير من أوروبا الفاصلة هي الفاصل العشري، فملف أرقام تفصلها فواصل لا يمكن قراءته. العرف هناك الفاصلة المنقوطة، وExcel يتبع ما يقوله فاصل القوائم الإقليمي في نظام التشغيل.

من هنا يأتي أشيع عطل في CSV على الإطلاق: ملف يُصدَّر على جهاز يُفتح عمودًا واحدًا على آخر. لا خلل في الملف. الجهازان يختلفان على ما هو الفاصل.

الملفات المفصولة بعلامات جدولة تُسمّى CSV باستمرار كذلك، والمفصولة بالشرطة العمودية تظهر في كل ما يتوقّع فواصل داخل البيانات.

ثانيًا: الاقتباس والتهريب

الحقل الذي يحوي الفاصل يجب حمايته، وقاعدة RFC أن تلفّه بعلامتي اقتباس مزدوجتين. أما الحقل الذي يحوي علامة اقتباس مزدوجة فيضاعفها:

"he said ""no""" تعني he said "no".

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

الحقل المقتبَس قد يحوي أيضًا فاصل أسطر، وهذا قانوني وصحيح ويكسر كل محلّل ساذج كُتب يومًا — لأن اقرأ الملف سطرًا سطرًا يصير خطأً لحظة أن يحوي حقل واحد سطرًا جديدًا.

ثالثًا: الترميز غير معلَن

ملف CSV لا يحوي ترويسة ولا إعلانًا ولا موضعًا يذكر فيه ترميزه. على القارئ أن يخمّن.

خمّن خطأً فيتشوّه كل محرف خارج ASCII — العربية والعلامات الصوتية وعلامات الاقتباس المنحنية ورموز العملات. الملف سليم والقارئ يقرؤه خطأً، ولهذا يُفتح الملف نفسه سليمًا في برنامج، بينما يُفتح طلاسم في آخر.

التلميح الوحيد المتاح داخل الملف علامة ترتيب البايتات في أوّله. Excel يحترمها، فـUTF-8 مع BOM هو الخيار العملي لملف سيُفتح بنقرة مزدوجة — وهي إزعاج لكل ما يحلّله برمجيًّا، إذ يرى ثلاثة بايتات غير متوقّعة قبل اسم العمود الأول.

رابعًا: نهايات الأسطر والصف الأخير

RFC 4180 ينصّ على إرجاع المؤشّر مع تغذية سطر. أنظمة يونكس تكتب تغذية السطر وحدها. كلاهما في كل مكان، ومحلّل يقسم على الخاطئ منهما يترك إرجاع مؤشّر شاردًا في نهاية كل حقل أخير.

قد يتبع السجلّ الأخير سطر جديد وقد لا يتبعه، ويختلف القارئون هل يعني ذلك وجود صف فارغ بعده. من هنا يأتي الصف الفارغ الغامض في أسفل عملية استيراد.

أشياء ليست ذنب الصيغة

الأنواع. لا أنواع في CSV. كل شيء نصّ، وأي تمييز بين الرقم 007 والسلسلة 007 يخترعه القارئ — ولهذا تختفي الأصفار البادئة وتصير رموز المنتجات تواريخ.

البنية. CSV مستطيل. البيانات المتداخلة لا تسعه، ثم إن تسطيحها قرار منفصل له مقايضات حقيقية.

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

كيف تكتب ملفًّا ينجو

UTF-8، مع BOM إن كان سيفتحه برنامج جداول. فواصل، مع اقتباس كل حقل يحوي فاصلة أو علامة اقتباس أو سطرًا جديدًا، ومضاعفة علامات الاقتباس الداخلية. نهايات CRLF. صف ترويسة. تواريخ بصيغة ISO 8601، فهي تُرتَّب صحيحًا ولا يمكن قراءتها على ترتيب إقليمي آخر.

ثم قل ما فعلت. سطر واحد في الرسالة المرفقة — UTF-8، فاصلة، مقتبَس — يوفّر وقتًا أكثر من أي قدر من الكتابة المتأنّية، لأن المستلم يستطيع ضبط أداة استيراده بدل التخمين.

كيف تقرأ ملفًّا لا ينجو

افتحه في محرّر نصوص أولًا. ثلاثون ثانية تخبرك بالفاصل وأسلوب الاقتباس وهل ثمّة ترويسة وهل الترميز صحيح. كل نافذة إعدادات استيراد تسألك هذه الأسئلة، والنظر أسرع من التخمين مرّتين.

ثم نظّفه قبل الاستيراد بدل مصارعة أداة الاستيراد — توحيد الفاصل والاقتباس والترميز في مرّة واحدة أسهل بكثير من إقناع برنامج جداول بقبول شيء غير مألوف.

الخلاصة

الاسم يصف واحدًا من أربعة أشياء تتغيّر. انظر إلى الملف قبل استيراده. اكتب UTF-8 مع BOM، واقتبس دفاعيًّا، وأخبر المستلم بما فعلت.

أسئلة

هل يوجد معيار رسمي لـCSV؟

RFC 4180 موجود وهو أقرب شيء إلى ذلك، لكنه نُشر عام 2005 وصفًا للممارسة الشائعة لا مواصفةً يلزم أحدًا اتّباعها. فهو وثيقة إعلامية لا وثيقة مسار معياري، وكثير من البرامج واسعة الانتشار أقدم منه ويتجاهله.

ما الفاصل الصحيح في CSV؟

الفاصلة، بحسب الاسم وبحسب RFC 4180. أما عمليًّا فجزء كبير من أوروبا يستعمل الفاصلة المنقوطة، لأن الفاصلة هناك هي الفاصل العشري، ولأن Excel يتبع إعداد فاصل القوائم الإقليمي. علامات الجدولة شائعة أيضًا. أي أداة استيراد موثوقة تسأل بدل أن تفترض.

كيف أهرّب فاصلة أو علامة اقتباس داخل حقل CSV؟

لفّ الحقل بعلامتي اقتباس مزدوجتين، وضاعف كل علامة اقتباس بداخله — فالحقل الذي يحوي "he said "no"" يُكتب "he said ""no""". تلك قاعدة RFC 4180. أما التهريب بالشرطة المائلة الخلفية فهو ما يلجأ إليه كثير من المبرمجين بدلًا منها، وهو ليس جزءًا من الصيغة.

أي ترميز ينبغي أن يستعمله ملف CSV؟

UTF-8، وإن كان الملف سيُفتح بنقرة مزدوجة في Excel فـUTF-8 مع علامة ترتيب البايتات. الصيغة لا تحمل موضعًا تعلن فيه ترميزها، فعلى القارئ أن يخمّن — وBOM هو التلميح الوحيد المتاح داخل الملف.

لماذا في ملف CSV عندي صف فارغ زائد في النهاية؟

سطر جديد لاحق بعد السجلّ الأخير. RFC 4180 يسمح به، ويختلف القارئون هل يعني صفًّا أخيرًا فارغًا. معظمها يتعامل معه؛ وبعضها ينتج صفًّا من سلاسل فارغة، فيسقط في التحقّق لاحقًا.

أدوات من هذا الدليل

المزيد من أدوات البيانات — كلّها تعمل في متصفّحك، ولا واحدة منها ترفع ملفًّا.