मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 2 का 4पाठ्यक्रम में 30/32~15 min
मॉड्यूल पाठ (2/4)

चुनौती: सीएसवी पार्सर

सीएसवी प्रारूप (अल्पविराम से अलग किए गए मान) हर जगह है: एक्सेल से निर्यात, डेटाबेस डंप, कमांड-लाइन टूल से आउटपुट। इसे पार्स करना एक छोटी सी चुनौती है जो स्प्लिट, मैप को जोड़ती है। विनाशकारी, और वस्तु निर्माण।

प्रारूप

न्यूनतम सीएसवी एक बहु-पंक्ति स्ट्रिंग है: पहली पंक्ति हेडर (कॉलम नाम) है, फिर एक अल्पविराम द्वारा अलग किए गए फ़ील्ड के साथ प्रति रिकॉर्ड पंक्ति।

Code
nome,eta,citta
Alice,30,Roma
Bob,25,Milano

क्लासिक लक्ष्य इसे वस्तुओं की एक श्रृंखला में बदलना है:

JS
[
  { nome: 'Alice', eta: '30', citta: 'Roma' },
  { nome: 'Bob', eta: '25', citta: 'Milano' },
];

3-चरणीय नुस्खा

  1. **स्ट्रिंग को लाइनों द्वारा विभाजित करें: csv.split('\n')
  2. हेडर पंक्ति निकालें: पहली पंक्ति, अल्पविराम से विभाजित
  3. प्रत्येक शेष पंक्ति को किसी ऑब्जेक्ट पर मैप करें, प्रत्येक फ़ील्ड को मिलान वाले हेडर के साथ जोड़ें
JS
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;
  });
}

अधिक आधुनिक विकल्प:

JS
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));

प्रकार परिवर्तित करना

पार्स किए गए फ़ील्ड हमेशा स्ट्रिंग्स होते हैं। यदि आप जानते हैं कि कुछ कॉलम संख्याएँ हैं:

JS
record.eta = Number(record.eta);

या एक छोटा सा "स्कीमा" लिखें:

JS
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
  const v = campi[i];
  record[nome] = numeriche.has(nome) ? Number(v) : v;
});

इसे अजमाएं

व्यायाम#js.m8.l2.e1
प्रयास: 0लोड हो रहा है...

`parseCSV(csv)` को परिभाषित करें जो एक CSV स्ट्रिंग लेता है (पहली पंक्ति = हेडर, विभाजक के रूप में अल्पविराम)। हेडर कुंजियों के साथ ऑब्जेक्ट की एक सरणी लौटाएँ। सभी मान स्ट्रिंग के रूप में रहते हैं। खाली पंक्तियों पर ध्यान न दें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

न्यूलाइन पर विभाजित, पहली पंक्ति = हेडर, शेष पर मानचित्र, ऑब्जेक्ट.फ्रॉमएंट्रीज़।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#js.m8.l2.e2
प्रयास: 0लोड हो रहा है...

`columnMean(csv, columnName)` को परिभाषित करें जो CSV को पार्स करता है, कॉलम मानों को संख्याओं में परिवर्तित करता है, और उनका माध्य (एक संख्या) लौटाता है। यदि कोई डेटा पंक्तियाँ नहीं हैं तो 0 लौटाएँ।

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्तंभ अनुक्रमणिका ढूंढें, मानचित्र पंक्तियाँ → संख्या, योग में घटाएँ, लंबाई से विभाजित करें।

3 प्रयासों के बाद समाधान उपलब्ध है