Чтение и запись файлов CSV с помощью Node.js

Введение Термин CSV [https://en.wikipedia.org/wiki/Comma-separated_values] - это аббревиатура, обозначающая значения, разделенные запятыми. Файл CSV - это простой текстовый файл, содержащий данные, отформатированные в соответствии со стандартом CSV. Он имеет отдельные строки, которые представляют записи, и каждое поле в записи отделяется от другого запятой. В CSV очень удобно хранить табличные данные: Имя, Фамилия, Возраст, Пол John, Snow, 26, M Clair, White, 33, Fancy, Brown, 78, F Здесь первая строка представляет

Вступление

Термин 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 правилами:

  1. Каждая запись находится на отдельной строке, разделенной разрывом строки (CRLF).
  2. Последняя запись в файле может иметь или не иметь конечный разрыв строки.
  3. Может быть необязательная строка заголовка, появляющаяся как первая строка файла с тем же форматом, что и обычные строки записи. Этот заголовок будет содержать имена, соответствующие полям в файле, и должен содержать то же количество полей, что и записи в остальной части файла (наличие или отсутствие строки заголовка должно указываться через необязательный параметр "header" этого Тип MIME).
  4. В заголовке и каждой записи может быть одно или несколько полей, разделенных запятыми. Каждая строка должна содержать одинаковое количество полей во всем файле. Пробелы считаются частью поля и не должны игнорироваться. За последним полем в записи нельзя ставить запятую.
  5. Каждое поле может быть заключено или не заключено в двойные кавычки (однако некоторые программы, такие как Microsoft Excel, вообще не используют двойные кавычки). Если поля не заключены в двойные кавычки, двойные кавычки могут не отображаться внутри полей.
  6. Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки.
  7. Если для заключения полей используются двойные кавычки, то двойные кавычки внутри поля должны быть экранированы, поставив перед ними другую двойную кавычку.

Если вам интересно прочитать больше с несколькими примерами, вы можете изучить исходный документ 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 предоставляют эту функциональность, поэтому вы должны выбрать тот, который лучше всего соответствует вашим потребностям и имеет постоянную поддержку.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus