המרת CSV ל-JSON

המירו CSV ל-JSON או JSON ל-CSV, עם זיהוי מפריד, טיפול בכותרות והמרת טיפוסים ללא אובדן נתונים.

CSV
JSON

הפלט יופיע כאן

מה הכלי הזה עושה

CSV הוא מה שגיליונות אלקטרוניים, ייצוא ממסדי נתונים ולוחות אנליטיקה נותנים לכם; JSON הוא מה שממשקי API וקוד רוצים. הכלי הזה ממיר ביניהם בשני הכיוונים, בדפדפן. הדביקו CSV ותקבלו מערך JSON — אובייקטים שמפתחותיהם משורת הכותרות, או מערכים פשוטים כשאין כותרות. החליפו כיוון ומערך JSON הופך ל-CSV, כשכל ערך מצוטט בדיוק כמה שצריך.

העבודה מתבצעת על המכשיר שלכם, וזה משנה כאן: CSV הוא הפורמט שאליו מייצאים רשימות לקוחות, חשבוניות ותמציות אנליטיקה. שום דבר מזה לא מועלה לשום מקום.

למה פיצול לפי פסיקים לא מספיק

הדרך המתבקשת לקרוא CSV — לפצל כל שורה לפי פסיקים — נשברת על קבצים אמיתיים, כי לפורמט יש מנגנון בריחה. שדה עטוף במרכאות כפולות יכול להכיל את המפריד, מרכאה מילולית שנכתבת כשתי מרכאות ברצף, ואפילו מעברי שורה — ואז רשומה אחת משתרעת על כמה שורות בקובץ. הכלי מממש את הכללים האמיתיים (RFC 4180) עם פרסר תו-אחר-תו, כך ששלושת המקרים עוברים שלמים.

name,note
Grace,"rear admiral, USN"
Ada,"she said ""hello"""
Alan,"two
lines"

לארבע הרשומות האלה יש שני שדות כל אחת, למרות הפסיקים, המרכאות ומעבר השורה הנוספים. אם הציטוט שגוי — שדה פותח מרכאה ולעולם לא סוגר אותה — תקבלו את השורה והעמודה שבהן המרכאה הבורחת התחילה, במקום טבלה שהתעוותה בשקט.

המפריד הוא לעיתים קרובות לא פסיק

למרות השם, ערכים מופרדי-פסיק לרוב אינם כאלה. באזורים שבהם הפסיק הוא הסימן העשרוני — רוב יבשת אירופה — אקסל מייצא עם נקודה-פסיק, כי 1,50 הוא מספר שם. כלי מסדי נתונים ושורת פקודה מייצאים לעיתים קרובות נתונים מופרדי-טאב, וצינורות לוגים אוהבים קווים אנכיים. הדבקה של אחד מאלה בכלי שמכיר רק פסיקים מייצרת עמודה אחת רחבה מאוד — התסכול הנפוץ ביותר סביב CSV.

לכן המפריד מזוהה ולא מונח מראש. כל מועמד נוסה, והמנצח הוא זה שמניב את אותו מספר עמודות בכל שורה — עקביות, לא הספירה הגבוהה ביותר, כי אחרת קובץ מלא בפסיקים עשרוניים היה נראה מופרד-פסיק. המפריד שזוהה מוצג תמיד, ואפשר לעקוף אותו אם הניחוש שגוי.

כותרות וצורת הפלט

כש«השורה הראשונה היא כותרת» דלוקה, השורה הזאת מספקת את שמות המפתחות והפלט הוא מערך אובייקטים — הצורה שכמעט כל API מצפה לה. כשהיא כבויה, כל שורה הופכת למערך ערכים, וזה מה שרוצים כשהקובץ מתחיל ישר בנתונים.

  • שורה עם פחות שדות מהכותרת מקבלת מחרוזות ריקות בעמודות החסרות, ולא מפתחות עם ערך undefined.
  • שמות כותרת כפולים הופכים לייחודיים (‏id, id_2, id_3) במקום לדרוס זה את זה — דריסה הייתה מוחקת עמודות בשקט.
  • תא כותרת ריק הופך ל-column_2, ‏column_3 וכן הלאה, כך שאף מפתח אינו מחרוזת ריקה.
  • שורות ריקות מדולגות, כמו בייבוא לגיליון אלקטרוני — קובץ מודבק מסתיים לא פעם ב-newline מיותר, ושורת ערכים ריקים שם נראית כמו באג.

המרת טיפוסים שלא יכולה לאבד נתונים

כל שדה ב-CSV הוא טקסט. להמיר טקסט שנראה מספרי למספרי JSON זה בדרך כלל מה שרוצים — אבל זו גם הדרך שבה נתונים נהרסים בשקט. מיקוד 01234 הופך ל-1234. מספר הזמנה בן 20 ספרות הופך למספר עשרוני מעוגל. מחיר שנכתב 1.50 מאבד את האפס בסוף.

הכלל שבו משתמשים כאן מונע את כל אלה בלי רשימת מקרים מיוחדים: ערך הופך למספר רק אם המרתו חזרה לטקסט משחזרת את המקור בדיוק. 42 עובר, ולכן מומר. 01234 לא, ולכן נשאר מחרוזת. כך גם 1.50, ‏+5, ‏1e5, וכל מספר שלם מעבר לנקודה שבה מספרים עשרוניים מאבדים דיוק. המחרוזות true ו-false הופכות לבוליאנים; שדה ריק נשאר מחרוזת ריקה ולא הופך ל-null, כי CSV לא יודע להביע את ההבדל בין «אין ערך» ל«ערך ריק», והמצאת אחד מהם היא המצאת מידע.

בחזרה ל-CSV

בכיוון ההפוך, מערך אובייקטים הופך לטבלה שעמודותיה הן איחוד כל המפתחות, לפי סדר הופעתם הראשונה — כך ששורות עם מפתחות שונים עדיין מיושרות, ומפתח חסר מייצר תא ריק. מערך מערכים נכתב שורה מול שורה. ציטוט מוחל רק היכן שהפורמט דורש: ערך שמכיל את המפריד, מרכאה או מעבר שורה נעטף, והמרכאות שבתוכו מוכפלות.

ערכים של-CSV אין דרך לייצג — אובייקט או מערך מקוננים — נכתבים כ-JSON בתוך התא שלהם, במקום להשתטח או להימחק, כך ששום דבר לא נעלם בהמרה. ‏null הופך לתא ריק.

שאלות נפוצות

למה הקובץ שלי יצא כעמודה אחת ענקית?
המפריד אינו זה שבו הכלי השתמש. בדרך כלל מדובר בקובץ נקודה-פסיק (התקן לאקסל באזורים אירופיים, שבהם הפסיק הוא הסימן העשרוני) או בייצוא מופרד-טאב. הזיהוי בדרך כלל תופס את זה — בדקו איזה מפריד מוצג, ובחרו אחר מהרשימה אם הניחוש היה שגוי.
למה המזהה שלי עדיין מחרוזת ב-JSON?
כי המרה הייתה משנה אותו. מספרים מומרים רק כשההמרה הפיכה במדויק, ולכן 01234 שומר על האפס המוביל ומזהים ארוכים שומרים על כל ספרה. אם אתם באמת רוצים אותם כמספרים, הנתונים צריכים להיכתב בלי האפס המוביל, או שאפשר להמיר בהמשך במקום שבו אתם שולטים בדיוק.
מה קורה לפסיקים ולמרכאות בתוך שדה?
הם נשמרים. בכניסה, שדה מצוטט יכול להכיל פסיקים, מרכאות כפולות ואפילו מעברי שורה; ביציאה, כל ערך שמכיל את המפריד, מרכאה או מעבר שורה מצוטט והמרכאות שבתוכו מוכפלות. ערך עובר CSV → JSON → CSV ללא שינוי.
האם הנתונים שלי מועלים לאנשהו?
לא. הפרסור וההמרה רצים כולם בדפדפן שלכם, כך שרשימות הלקוחות, הייצוא והדוחות שחיים בדרך כלל ב-CSV לעולם לא עוזבים את המכשיר.