שיעורי מודול (2/4)
אתגר: מנתח CSV
פורמט CSV (ערכים מופרדים בפסיקים) נמצא בכל מקום: יצוא מ-Excel, dump מסדי נתונים, פלט מכלי שורת הפקודה. ניתוח זה הוא אתגר קטן המשלב פיצול, מפה, הסרת מבנה, ובניית חפצים.
הפורמט
קובץ CSV מינימלי הוא מחרוזת מרובת שורות: השורה הראשונה היא הכותרת (שמות עמודות), ולאחר מכן אחת שורה לכל רשומה עם שדות מופרדים בפסיקים.
nome,eta,citta
Alice,30,Roma
Bob,25,Milano
המטרה הקלאסית היא להפוך אותו למערך של אובייקטים:
[
{ nome: 'Alice', eta: '30', citta: 'Roma' },
{ nome: 'Bob', eta: '25', citta: 'Milano' },
];המתכון בן 3 השלבים
- פצל את המחרוזת לפי שורות:
csv.split('\n') - חלץ את שורת הכותרת: השורה הראשונה, מפוצלת בפסיק
- מפה כל שורה שנותרה לאובייקט, התאמה של כל שדה עם הכותרת התואמת
function parseCSV(csv) {
const righe = csv.split('\n');
const intestazione = righe[0].split(',');
return righe.slice(1).map((riga) => {
const campi = riga.split(',');
const record = {};
intestazione.forEach((nome, i) => {
record[nome] = campi[i];
});
return record;
});
}חלופות מודרניות יותר:
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));המרת סוגים
שדות מנותחים הם תמיד מחרוזות. אם אתה יודע שחלק מהעמודות הן מספרים:
record.eta = Number(record.eta);או כתוב "סכמה" קטנה:
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
const v = campi[i];
record[nome] = numeriche.has(nome) ? Number(v) : v;
});נסה את זה
הגדר `parseCSV(csv)` שלוקח מחרוזת CSV (שורה ראשונה = כותרת, פסיקים כמפריד). החזר מערך של אובייקטים עם מקשי הכותרת. כל הערכים נשארים כמחרוזות. התעלם משורות ריקות.
הצג רמז
פיצול בשורה חדשה, שורה ראשונה = כותרת, מפה מעל השאר, Object.fromEntries.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר `columnMean(csv, columnName)` שמנתח את ה-CSV, ממיר את ערכי העמודה למספרים ומחזיר את הממוצע שלהם (מספר). אם אין שורות נתונים החזר 0.
הצג רמז
מצא את אינדקס העמודות, מפה שורות ← מספר, צמצם לסכום, חלק באורך.
הפתרון זמין לאחר 3 ניסיונות