برای تبدیلِ CSVبهJSON،اول معلوم کنید چه چیزی باید برابر بماند:بایتِ فایل یا مقدارِ هر فیلد؟ ابزارِ محلیِ این صفحه چهار رکوردِ اصیل را به آرایهٔ objectها و دوباره بهCSVبرمیگرداند. قرارداد،سه ستونِ ثابت و مقدارهای تماماً رشتهای است. دادهٔ هر رکورد حفظ میشود؛اما BOM،نقلقولگذاری و پایانِ خطِ فایل میتوانند متفاوت شوند.
قراردادِ کوچک،پیش از تبدیل
ترتیبِ سرستونها دقیقاًid،noteوstatusاست. مبدأUTF-8باBOMیا بدونِ آن پذیرفته میشود؛delimiterویرگول،quoteعلامتِ دوتایی وdoublequoteفعال است. فایلِ نمونه چهار رکورد دارد:شناسهٔ001،متنِ فارسیِ دارای ویرگول،فیلدِ چندخطی،نقلقولِ درونی و مقدارِ خالی در آن دیده میشوند.
رشتهٔ فقطفاصله با خالی فرق دارد. این قرارداد نه مقدارِ پیشفرض میسازد،نه001را عددِ۱میکند. درJSONهمidاز نوعِstringاست. اگر مقصد نوع یا نامِ دیگری میخواهد،آن نگاشت تصمیمی جداست؛نامِ «تبدیلِ قالب» نباید تبدیلِ معناییِ بیاعلان را پنهان کند.
چرا splitروی ویرگول کافی نیست؟
درnoteِ«الف,ب»،ویرگول بخشی از مقدار است. در «دو» و «خط»،newlineدرونِ همان فیلد قرار دارد. parserاستاندارد مرزها را با قواعدِ نقلقول میخواند؛در نتیجه هر کدام یک مقدارِ رشتهای میمانند. نویسنده هم هنگامِ خروجی،نقلقولِ لازم و دوبرابرکردنِquoteِداخلی را انجام میدهد.
| مقدارِ اصیل | انتظارِ JSON | پس از برگشت |
|---|---|---|
| 001 | رشتهٔ سهرقمی | همان صفرهای اول |
| الف,ب | یک رشته | یک فیلد،نه دو ستون |
| متنِ دوخطی | رشتهٔ دارای newline | یک رکوردِ منطقی |
| خالی و یک SPACE | دو مقدارِ متفاوت | بدونِ trimیاجایگزینی |
هشت حالتِ ناسازگار را واقعی رد کنیم
در مسیرِJSONبهCSV،مقدارِnull،خانهٔ مفقود،کلیدِ اضافی،objectِتودرتو و مقدارِ عددی رد میشوند؛اینها با زیرمجموعهٔ تماماً رشتهای توافق ندارند. کد از تبدیلِ خودکارِNoneبهخالی اجتناب میکند،چون پس از آن نمیتوان فهمید اصلِ مقدارnullبوده یا رشتهٔ خالی.
در مسیرِCSV،سرستونِ تکراری،ردیفِ کوتاه و ستونِ اضافی هم آزموده و رد میشوند. سرستون با ترتیبِ دیگر نیز قراردادِ فعلی نیست؛آن را بیصدا مرتب نمیکنیم. این ردها به معنیِ نامعتبر بودنِ عمومیِ همهٔ آن ساختارها نیستند؛این تمرین عمداً دامنهٔ کوچکی برای برابریِ قابلسنجش دارد.
برابریِ داده را آزمون کنیم
چهار objectِمورد انتظار جدا در کد نوشته شدهاند. خروجیِ خواندنِ CSVباید دقیقاً با آنها برابر باشد؛سپسJSONباencoderساخته و باdecoderباز میشود. پس از تولیدِCSVجدید،دوباره همان parserرا اجرا میکنیم و همهٔ رشتهها و ترتیبِ رکوردها با انتظارِ مستقل مقایسه میشوند.
مسیرِ خالی هم آزموده میشود:آرایهٔ خالی،CSVدارای فقطِ سرستون میدهد و به آرایهٔ خالی برمیگردد. نسخهٔ اجراPython۳٫۱۲٫۱۴است و همهٔ کار در حافظه انجام شده است. این یک اسکریپتِ قابلِدریافت است،نه فرمِ تبدیلِ آماده در مرورگر یا اتصالِ اجراشده به سامانهٔ مقصد.
هشِ متفاوت،با مقدارِ برابر
مبدأBOM،پایانِ خطِCRLFو نقلقولِ همهٔ خانهها را دارد؛خروجی بدونِBOM،باLFوquoteِحداقلی ساخته میشود. بنابراین بایتها وSHA-256دو فایل متفاوتاند،درحالیکه رکوردها و مقدارهای رشتهای برابرند. برای نگهداریِ شاهدِ فایلِ اصلی،آن نسخه باید جدا حفظ شود.
از این نتیجه نمیتوان برابریِ همهٔ فایلهایCSVیاحفظِ byte-for-byteرا وعده داد. تبدیلِ تاریخ،اعشار،null،آرایهٔ تودرتو،dialectهای دیگر و ترتیبِ دلخواهِ ستونها خارجِ دامنهاند. ورودی تا۱۶کیبیبایت و۱۰۰رکورد،و مقادیرِ مسیرِ برگشت تا۱۰۲۴codepointمحدود شدهاند؛اینها سقفِ آموزشیاند.
نقلقول،فرمول را بیخطر نمیکند
یکnoteعمداً رشتهٔ=1+1است؛درJSONوپس از برگشت همان رشته باقی میماند. کد آن را در spreadsheetاجرا نمیکند و خروجی را برای بازشدن در هر نرمافزار امنسازیشده نمینامد. quotingبرای مرزِCSVاست؛سیاستِ تفسیرِ فرمول در مقصد،موضوعی جداست.
راهنمای صفرِ اول و کنترلِ قبل از ایمپورت مرحلهٔ انتخابِ نوع و آزمونِ مقصد را ادامه میدهند. برای اتصالِ داده در راهکارهای اپرا،قراردادِ واقعیِ فرستنده و گیرنده را مطرح کنید؛این تمرین نه فایلِ مشتری را منتقل میکند و نه وجودِ چنین مبدلی در محصول را اعلام میکند.
فایل تمرین و منبع
کدِ کاملِ محلیِ تمرین و کنترلهایش · دادهٔ اصیل و نتیجهٔ اجرای واقعی؛ نویسههای کنترلی escape شدهاند
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.