メインコンテンツにスキップ
モジュール 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ステップレシピ

  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読み込み中…

CSV 文字列 (最初の行 = ヘッダー、区切り文字としてカンマ) を受け取る `parseCSV(csv)` を定義します。ヘッダー キーを含むオブジェクトの配列を返します。すべての値は文字列のままです。空の行を無視します。

エディターを読み込み中…
ヒントを表示

改行で分割、最初の行 = ヘッダー、残りの上にマップ、Object.fromEntries。

3 回の試行後に解決策が利用可能になります

復習演習

運動#js.m8.l2.e2
試行回数: 0読み込み中…

CSV を解析し、列の値を数値に変換し、その平均 (数値) を返す `columnMean(csv, columnName)` を定義します。データ行がない場合は 0 を返します。

エディターを読み込み中…
ヒントを表示

列インデックスを見つけて、行→数値をマップし、合計を求め、長さで割ります。

3 回の試行後に解決策が利用可能になります