モジュール 8 · レッスン 2 / 4コース内の 30/32~15 min
モジュールのレッスン (2/4)
課題: CSV パーサー
CSV 形式 (カンマ区切り値) は、Excel からのエクスポート、データベース ダンプ、 コマンドラインツールからの出力。これを解析するのは、分割、マップ、 構造化とオブジェクトの構築。
フォーマット
最小限の CSV は複数行の文字列です。最初の行は ヘッダー (列名)、次に 1 行です。 カンマで区切られたフィールドを持つレコードごとの行。
Code
nome,eta,citta
Alice,30,Roma
Bob,25,Milano
古典的な目標は、それをオブジェクトの配列に変換することです。
JS
[
{ nome: 'Alice', eta: '30', citta: 'Roma' },
{ nome: 'Bob', eta: '25', citta: 'Milano' },
];3ステップレシピ
- 文字列を行ごとに 分割します:
csv.split('\n') - ヘッダー行を抽出します。最初の行をカンマで区切ります。
- 残りの各行をオブジェクトにマッピングし、各フィールドを一致するヘッダーとペアにします。
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読み込み中…
CSV 文字列 (最初の行 = ヘッダー、区切り文字としてカンマ) を受け取る `parseCSV(csv)` を定義します。ヘッダー キーを含むオブジェクトの配列を返します。すべての値は文字列のままです。空の行を無視します。
エディターを読み込み中…
ヒントを表示
改行で分割、最初の行 = ヘッダー、残りの上にマップ、Object.fromEntries。
3 回の試行後に解決策が利用可能になります
復習演習
運動#js.m8.l2.e2
試行回数: 0読み込み中…
CSV を解析し、列の値を数値に変換し、その平均 (数値) を返す `columnMean(csv, columnName)` を定義します。データ行がない場合は 0 を返します。
エディターを読み込み中…
ヒントを表示
列インデックスを見つけて、行→数値をマップし、合計を求め、長さで割ります。
3 回の試行後に解決策が利用可能になります