You are currently viewing Как читать и записывать CSV-файлы с помощью Node.js

Как читать и записывать CSV-файлы с помощью Node.js

Значения, разделенные запятыми, более известные как CSV, долгое время использовались в качестве стандартного текстового способа представления и передачи данных. Существует множество способов чтения и записи CSV-файлов в Node.js. В этом посте мы узнаем, как читать CSV-файл и писать CSV-файл с помощью Node.js эффективным способом. Давайте начнем.

Содержание

Подробнее о CSV

Файл CSV-это обычный текстовый файл, содержащий данные, отформатированные в соответствии со стандартом CSV. Каждая строка представляет собой запись, и каждое поле в записи отделено друг от друга специальным символом, который ,в случае CSV является запятой. Табличные данные легко представлять в формате CSV. Ниже приведен фрагмент данных о вакцинации против COVID-19 в пригородах Нового Южного Уэльса:Копировать

State,Suburb,2019 ERP population,% Vaccinated - Dose 1,% Vaccinated - Dose 2
New South Wales,Albury,"52,067",>95%,>95%
New South Wales,Armidale,"31,679",92.4%,88.9%
New South Wales,Auburn,"86,994",94.1%,91.0%
New South Wales,Bankstown,"147,237",93.3%,89.9%
New South Wales,Bathurst,"39,532",>95%,93.0%
New South Wales,Baulkham Hills,"124,066",>95%,>95%
New South Wales,Blacktown,"115,631",>95%,>95%
New South Wales,Blacktown - North,"85,385",>95%,>95%
New South Wales,Blue Mountains,"64,747",>95%,>95%
New South Wales,Botany,"45,823",>95%,>95%

CSV-файлы используются для многих целей, одним из наиболее распространенных способов использования является импорт и экспорт данных. Даже если для конкретной новой системы не создан пользовательский интерфейс, данные могут быть импортированы в виде CSV, в основном взятых из какой-либо программы электронных таблиц. Это может быть использовано в качестве быстрого старта для ввода необходимых данных в систему.

Аналогично, CSV отлично подходят для экспорта данных из некоторых таблиц/отчетов. Они служат отправной точкой, которую можно открыть в программе электронных таблиц для дальнейшего анализа данных. Несомненно, Node.js может использоваться как для анализа, так и для создания CSV-файлов, мы рассмотрим параметры в следующем разделе.

Опции для чтения и записи CSV в Node.js

Существует несколько пакетов NPM для чтения и/или записи CSV-файлов с помощью Node.js. Самый популярный из них-Fast CSV, это сочетание быстрого csv/анализа для чтения CSV-файлов и быстрого csv/форматирования для форматирования и записи CSV-файлов. Некоторые другие опции включают csv-анализаторcsv-писательаккуратный csv и csv, чтобы назвать некоторые из них. Подробная информация о популярности с точки зрения загрузки обсуждается в конце этой статьи. Было бы хорошее время, чтобы освежить знания о том, как читать файл построчно в node.js если это вас интересует.

Весь приведенный ниже код будет запущен на узле 14, и ожидается, что вы знаете, как устанавливать пакеты npm с помощью npm install. Давайте рассмотрим, как использовать быстрый CSV для чтения существующего CSV-файла с помощью Node.js следующий.

Быстрый CSV для чтения CSV-файлов в Node.js

Чтение существующего CSV из файловой системы или CSV, загруженного пользователем, довольно просто. В приведенном ниже примере мы увидим, как прочитать CSV-файл из файловой системы, в которой содержится ~85 тыс. записей обо всех подтвержденных случаях COVID-19 в Австралии по пригородам, как показано в этом CSV-файле.

const fs = require('fs');
const path = require('path');
const { parse } = require('fast-csv');

let rows = [];

fs.createReadStream(path.resolve(__dirname, 'confirmed_cases_au_by_location.csv'))
  .pipe(parse({ headers: true }))
  .on('error', error => console.error(error))
  .on('data', row => {
      console.log(row);
      //each row can be written to db
      rows.push(row);
  })
  .on('end', rowCount => {
      console.log(`Parsed ${rowCount} rows`);
      console.log(rows[81484].postcode); // this data can be used to write to a db in bulk
  });

Давайте теперь немного проанализируем код. Во-первых, нам требуются собственные модули fs и path. Затем нам требуется parse функция из fast-csv пакета npm. После этого мы создаем пустой массив под названием “строки”, в который мы поместим все строки, прочитанные из CSV-файла.

Далее из файла создается читаемый поток, который передается в функцию синтаксического анализа с заголовками true. Значение headers true означает анализ информации заголовка из каждой строки. В случае какой-либо ошибки она отображается в консоли, и в каждой строке мы регистрируем строку и также помещаем ее в rows массив. Когда чтение заканчивается, мы console.log получаем номер для проанализированных строк и postcode номер из последней строки. На приведенный выше код также можно ссылаться на Github.

Эти данные могут быть легко записаны в базу данных MySQL, PostgreSQL или SQLite с помощью Node.js. Мы можем запустить приведенный выше скрипт, time node read-csv.js который завершится следующим выводом:

Как видно выше, сценарию потребовалось всего 1,87 секунды, чтобы прочитать 81485 строк и распечатать их на экране. Следовательно, мы рассмотрим, как написать CSV — файл с помощью быстрого CSV.

Напишите CSV в Node.js с быстрым CSV

Для записи CSV-файла с помощью Fast CSV мы будем использовать format пакет, включенный в модуль npm Fast CSV. Ниже приведен краткий пример, в котором мы записываем 80 Тыс. случайных строк в тестовый CSV-файл, который также мог быть данными, извлеченными из базы данных.

const fs = require('fs');
const { format } = require('@fast-csv/format');
const fileName = 'randoms.csv';
const csvFile = fs.createWriteStream(fileName);

let randoms = [];
const min = 1;
const max = 90000;
const noOfRows = 80000;
const stream = format({ headers:true });
stream.pipe(csvFile);

for(i=0; i<noOfRows; i++) {
  randoms.push({ 
    characters: Math.random().toString(36).substr(2, 7), 
    number: Math.floor(Math.random() * (max - min + 1) + min)
  });
  stream.write(randoms[i]);
}

console.log(randoms[79999].number);//with randoms array, all data could have been written at the end too
stream.end();
console.log(`${fileName} written with stream and ${noOfRows} rows`);

После дальнейшей проверки кода мы сможем узнать, что делается. Во-первых, требуется модуль собственной файловой системы (fs). Затем также включается метод format from fast-csv/format. Впоследствии мы определяем две переменные, одна из которых указывает имя файла, а другая-доступный для записи поток, указывающий на файл CSV.

Следовательно, мы определяем еще несколько констант, которые помогут нам сгенерировать случайный массив объектов с 80 тысячами случайных строк и чисел, как показано в приведенном выше цикле. Перед созданием числа мы передаем поток CSV в CSV-файл, что означает, что каждый раз, когда мы что-либо записываем в поток CSV, это также будет записано в файл.

Наконец, мы консольно регистрируем случайное число из последней строки и завершаем поток. Затем мы также регистрируем имя файла и количество строк в файле CSV в качестве примера. Приведенный выше файл также доступен на Github.

Когда мы запускаем приведенный выше скрипт, time node write-csv.js он выводит следующий вывод:

Как видно выше, сценарию потребовалось всего 0,52 секунды, чтобы написать CSV-файл с 80 тысячами строк со случайно сгенерированными значениями. Это было быстро также из-за использования потоков.

Весь приведенный выше код доступен в качестве общедоступного репозитория GitHub для вашей справки.

Быстрый CSV, безусловно, не единственный пакет для анализа и написания CSV, есть и другие пакеты. Краткое сравнение тенденций NPM для 5 популярных пакетов CSV показывает следующие результаты:

Быстрый CSV-файл имеет более 900 тыс. загрузок в неделю, что является одним из самых популярных вариантов для работы с CSV в Node.js. Разобрать файл CSV , который не сравнивается здесь насчитывается более 1,8 миллиона загрузок в неделю, все же, это не супер прост в использовании, так как быстро CSV, но наверняка имеет множество других функций. Выбор подходящего пакета можно оставить в зависимости от потребностей проекта.

Вывод

Мы рассмотрели, как читать и записывать CSV-файлы с помощью Node.js с быстрым модулем CSV npm. Имея в общей сложности менее 50 строк кода, мы смогли читать и записывать относительно большие CSV-файлы, используя Node.js менее чем за 2 секунды, что довольно хорошо.