Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как прочитать CSV-файл в JavaScript

Короткий ответ

Для простых файлов разбейте текст на строки, а каждую строку — по запятым. В первой строке — названия столбцов:

const csv = 'name,city,age\nAnna,Rome,30\nOleg,Paris,25';
 
const [header, ...rows] = csv.split('\n').map((line) => line.split(','));
const people = rows.map((row) => Object.fromEntries(header.map((key, i) => [key, row[i]])));
 
console.log(people[1].city);
console.log(JSON.stringify(people[0]));

Результат:

Paris
{"name":"Anna","city":"Rome","age":"30"}

Из файла в Node.js

Прочитайте файл и примените тот же разбор:

import { readFile, writeFile } from 'node:fs/promises';
 
await writeFile('prices.csv', 'item,price\ntea,3.5\ncake,4\n');
 
const lines = (await readFile('prices.csv', 'utf8')).trim().split(/\r?\n/);
const total = lines.slice(1).reduce((sum, line) => sum + Number(line.split(',')[1]), 0);
 
console.log(total);

Результат:

7.5

Значения в кавычках

Значения с запятыми заключают в кавычки. Регулярное выражение может взять значение в кавычках целиком:

const parseLine = (line) =>
  [...line.matchAll(/"((?:[^"]|"")*)"|([^,]+)|(?<=,|^)(?=,|$)/g)].map((m) =>
    m[1] !== undefined ? m[1].replaceAll('""', '"') : m[2] ?? '',
  );
 
console.log(parseLine('Anna,"Rome, Italy",30'));

Результат:

[
  "Anna",
  "Rome, Italy",
  "30"
]

Частая ошибка

Простой split(',') ломает значения, в которых есть запятые. Для настоящих файлов с кавычками и переводами строк внутри значений используйте готовую библиотеку для CSV.

console.log('Anna,"Rome, Italy",30'.split(',').length);

Результат:

4

Функции из этого ответа

  • String.prototype.split — Разбивает строку на массив по разделителю.
  • Array.prototype.map — Создаёт новый массив, преобразуя каждый элемент.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.