Вступление
Термин CSV - это аббревиатура, обозначающая значения, разделенные запятыми .
Файл CSV - это простой текстовый файл, содержащий данные, отформатированные в соответствии со стандартом CSV. Он имеет отдельные строки, которые представляют записи, и каждое поле в записи отделяется от другого запятой.
Табличные данные хранить в CSV очень удобно:
Name,Surname,Age,Gender
John,Snow,26,M
Clair,White,33,F
Fancy,Brown,78,F
Здесь первая строка представляет заголовки столбцов / полей наших записей CSV, а затем есть 3 записи, которые представляют определенных людей. Как видите, значения разделены запятыми, и каждая запись начинается с новой строки.
Эй, а что, если мы хотим включить запятые или разрывы строк в некоторые поля, которые хранятся в формате CSV?
Есть несколько подходов к решению этой проблемы, например, мы могли бы заключить такие значения в двойные кавычки. Однако некоторые реализации CVS не поддерживают эту функцию по дизайну.
Стандартизация CSV
Один из наиболее часто используемых стандартов CSV описан в RFC4180 .
Согласно ему, формат CSV описывается этими 7 правилами:
- Каждая запись находится на отдельной строке, разделенной разрывом строки (CRLF).
- Последняя запись в файле может иметь или не иметь конечный разрыв строки.
- Может быть необязательная строка заголовка, появляющаяся как первая строка файла с тем же форматом, что и обычные строки записи. Этот заголовок будет содержать имена, соответствующие полям в файле, и должен содержать то же количество полей, что и записи в остальной части файла (наличие или отсутствие строки заголовка должно указываться через необязательный параметр "header" этого Тип MIME).
- В заголовке и каждой записи может быть одно или несколько полей, разделенных запятыми. Каждая строка должна содержать одинаковое количество полей во всем файле. Пробелы считаются частью поля и не должны игнорироваться. За последним полем в записи нельзя ставить запятую.
- Каждое поле может быть заключено или не заключено в двойные кавычки (однако некоторые программы, такие как Microsoft Excel, вообще не используют двойные кавычки). Если поля не заключены в двойные кавычки, двойные кавычки могут не отображаться внутри полей.
- Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки.
- Если для заключения полей используются двойные кавычки, то двойные кавычки внутри поля должны быть экранированы, поставив перед ними другую двойную кавычку.
Если вам интересно прочитать больше с несколькими примерами, вы можете изучить исходный документ RFC4180, ссылка на который приведена выше.
Чтение файлов CSV в Node.js
Чтобы прочитать CSV-файл в Node.js, мы не могли бы использовать ничего,
кроме fs
, поскольку по сути CSV-файл представляет собой простой
текстовый файл.
Если вам интересно узнать больше о чтении файлов с помощью Node.js или написании файлов с помощью Node.js , у нас есть и то, и другое!
Однако есть несколько полезных модулей, которые могут обрабатывать
создание или анализ содержимого CSV за нас. Начнем с установки модуля
csv-parser
:
$ npm i -s csv-parser
Затем давайте поместим данные CSV из начала статьи в файл с именем «data.csv» и рассмотрим очень простой пример:
const csv = require('csv-parser');
const fs = require('fs');
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => {
console.log(row);
})
.on('end', () => {
console.log('CSV file successfully processed');
});
Здесь мы создаем readStream
с помощью fs
, перенаправляем его в
csv
, который затем data
каждый раз, когда обрабатывается новая
строка из файла CSV. end
событие запускается, когда все строки из
CSV-файла обрабатываются, и мы записываем короткое сообщение в консоль,
чтобы указать это.
В демонстрационных целях мы просто console.log
каждой обработанной
строки, и после запуска кода вы увидите этот вывод в своей консоли:
Row {
Name: 'John',
'Surname': 'Snow',
'Age': '26',
'Gender': 'M' }
Row {
Name: 'Clair',
'Surname': 'White',
'Age': '33',
'Gender': 'F' }
Row {
Name: 'Fancy',
'Surname': 'Brown',
'Age': '78',
'Gender': 'F' }
CSV file successfully processed
Написание файлов CSV в Node.js
Помня о том, что файлы CSV - это просто текстовые файлы, мы всегда можем
ограничиться использованием только собственного fs
, но, чтобы
облегчить нашу жизнь, мы будем использовать другой распространенный
модуль npm
csv-writer
.
Сначала идет установка:
$ npm i -s csv-writer
Затем код:
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({
path: 'out.csv',
header: [
{id: 'name', title: 'Name'},
{id: 'surname', title: 'Surname'},
{id: 'age', title: 'Age'},
{id: 'gender', title: 'Gender'},
]
});
const data = [
{
name: 'John',
surname: 'Snow',
age: 26,
gender: 'M'
}, {
name: 'Clair',
surname: 'White',
age: 33,
gender: 'F',
}, {
name: 'Fancy',
surname: 'Brown',
age: 78,
gender: 'F'
}
];
csvWriter
.writeRecords(data)
.then(()=> console.log('The CSV file was written successfully'));
Модуль csv-writer
требует начальной конфигурации, в которой мы
предоставляем ему имя полученного CSV-файла и конфигурацию header
Примечание . В нашем объекте JavaScript все свойства указаны в нижнем регистре, но в файле CSV первые буквы из них должны быть заглавными.
После завершения настройки все, что нам нужно сделать, это вызвать
writeRecords
, передать data
, представляющий структуру данных,
которая должна быть записана в файл CSV.
Как только этот процесс будет завершен, мы выведем на консоль информационное сообщение о том, что программа завершена.
Использование модуля fast-csv
Экосистема Node.js и npm
предоставляют множество возможностей для
чтения и записи файлов CSV. Мы покажем еще один пример популярного
модуля CSV и посмотрим, как мы можем записать наш массив данных,
используя в качестве альтернативы модуль fast-csv
Сначала нам нужно установить модуль:
$ npm i -s fast-csv
const fastcsv = require('fast-csv');
const fs = require('fs');
const ws = fs.createWriteStream("out.csv");
fastcsv
.write(data, { headers: true })
.pipe(ws);
API немного другой, но результат идентичный. Всего за пару строк кода нам удалось записать массив объектов JavaScript в файл CSV, который впоследствии можно было бы использовать во множестве других приложений.
Заключение
Чтение и запись файлов CSV с помощью Node.js - распространенная задача
разработки, поскольку формат CSV обычно используется для хранения
структурированных табличных данных. Многие npm
предоставляют эту
функциональность, поэтому вы должны выбрать тот, который лучше всего
соответствует вашим потребностям и имеет постоянную поддержку.