Как прочитать 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 — Создаёт новый массив, преобразуя каждый элемент.