Рубрики
Без рубрики

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

В этом руководстве мы будем использовать Node-CSV Suite или, скорее, модули CSV-Parse и CSV-Stringify для чтения и записи файла CSV в Node.js с примерами.

Автор оригинала: Aniuchi Adaobi.

Вступление

Общее задание разработки – это чтение данных из файлов. Общий формат файла – это .csv формат.

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

Множество модулей обеспечивают такие возможности, такие как Neat-CSV или CSV-Parser пакеты. Однако в этой статье мы будем использовать Узел-CSV – набор пакетов CSV для генерации, анализа, преобразования и настраивания данных CSV.

Установка узла-CSV

Модуль состоит из CSV-Generate , CSV-Parse , CSV-преобразование и CSV-Stringify пакеты.

Вы можете установить весь набор, либо каждый пакет один за другим, если вам все они все. Давайте инициализируем проект узла с настройками по умолчанию:

$ npm init -y

Тогда давайте установим весь Узел-CSV Люкс:

$ npm install node-csv

Мы будем работать с файлом CSV с этим содержимым:

Account Name,Account Code,Type,Description
Cash,101,Assets,Checking account balance
Wages Payable,220,Liabilities,Amount owed to employes for hours not yet paid
Rent expense,560,Expenses,Cost of occupied rented facilities during accounting period

Чтение файлов CSV с CSV-Parse

Чтобы прочитать файлы CSV, мы будем использовать CSV-Parse Пакет из Узел-CSV Отказ

CSV-Parse Пакет предоставляет несколько подходов для анализа файлов CSV – с использованием обратных вызовов, потока + обратный вызов, а также синхронизация и ASYNC API. Мы будем покрывать Поток + API обратного вызова и Sync API Отказ

Поток + API обратного вызова

Давайте создадим файл, называемый index.js и построить Парсер :

var fs = require('fs'); 
var parse = require('csv-parse');
var parser = parse({columns: true}, function (err, records) {
	console.log(records);
});

fs.createReadStream(__dirname+'/chart-of-accounts.csv').pipe(parser);

Во-первых, мы импортируем собственную файловую систему модуля ( FS ) и CSV-Parse модуль. Тогда мы создаем Парсер который принимает объектный литерал, содержащий варианты, которые мы хотели бы установить. Второй аргумент – это функция обратного вызова, которая используется для доступа к записям – или просто распечатать их в нашем случае.

Варианты, которые мы можем установить, не являются обязательными. В большинстве случаев вы будете использовать любой из разделитель , литой или Колонны параметры:

Наконец, мы открыли поток чтения, используя ФС Модуль и начал трубы в парсере.

Давайте запустим этот файл:

$ node index.js

Это приводит к:

[
  {
    'Account Name': 'Cash',
    'Account Code': '101',
    Type: 'Assets',
    Description: 'Checking account balance'
  },
  {
    'Account Name': 'Wages Payable',
    'Account Code': '220',
    Type: 'Liabilities',
    Description: 'Amount owed to employes for hours not yet paid'
  },
  {
    'Account Name': 'Rent expense',
    'Account Code': '560',
    Type: 'Expenses',
    Description: 'Cost of occupied rented facilities during accounting period'
  }
]

Вместо того, чтобы просто печатать содержимое, вы можете манипулировать этими данными, строить объекты с информацией из этих полей или, например, сохранить их в базу данных.

Используя Sync API

Давайте повторим эту функциональность с помощью синхронизации API:

var fs = require('fs').promises;
var parse = require('csv-parse/lib/sync');
(async function () {
    const fileContent = await fs.readFile(__dirname+'/chart-of-accounts.csv');
    const records = parse(fileContent, {columns: true});
    console.log(records)
})();

Опять же, мы импортируем ФС Модуль и синхронизация API из CSV-Parse модуль.

Тогда мы создаем async Функция, в которой мы извлекаем содержимое файла по ждать Отклика от readfile () функция.

Тогда мы можем создать Парсер который принимает содержимое файла в качестве первого аргумента и литерала объекта в качестве второго. Этот литерал объекта содержит варианты создания парсера (мы установили столбцы на True ). Этот парсер присваивается постоянной переменной, и мы просто распечатываем его содержимое ради краткости:

[
  {
    'Account Name': 'Cash',
    'Account Code': '101',
    Type: 'Assets',
    Description: 'Checking account balance'
  },
  {
    'Account Name': 'Wages Payable',
    'Account Code': '220',
    Type: 'Liabilities',
    Description: 'Amount owed to employes for hours not yet paid'
  },
  {
    'Account Name': 'Rent expense',
    'Account Code': '560',
    Type: 'Expenses',
    Description: 'Cost of occupied rented facilities during accounting period'
  }
]

Написание файлов CSV с помощью CSV Stringify

Похоже на чтение, мы бы иногда нравились Написать данные в формате CSV. Для этого мы будем использовать CSV-Stringify Пакет из Узел-CSV Люкс. Строгование Просто означает, что мы преобразуем некоторые данные (JSON в нашем примере) в строку. Эта строка затем записывается в файл в формате CSV.

Предположим, у вас есть какие-нибудь содержание JSON, которое вы хотели бы записать как файл CSV:

var someData = [
    {
        "Country": "Nigeria",
        "Population": "200m",
        "Continent": "Africa",
        "Official Language(s)": "English"
    },
    {
        "Country": "India",
        "Population": "1b",
        "Continent": "Asia",
        "Official Language(s)": "Hindi, English"
    },
    {
        "Country": "United States of America",
        "Population": "328m",
        "Continent": "North America",
        "Official Language": "English"
    },
    {
        "Country": "United Kingdom",
        "Population": "66m",
        "Continent": "Europe",
        "Official Language": "English"
    },
    {
        "Country": "Brazil",
        "Population": "209m",
        "Continent": "South America",
        "Official Language": "Portugese"
    }
]

CSV-Stringify Упаковка также имеет пару API-вариантов, однако, API обратного вызова предлагает действительно простой способ сократить данные, без необходимости обрабатывать такие события, как с API по потоку.

Давайте пойдем вперед и затрагиваем данные выше, прежде чем писать его в файл:

var fs = require('fs');
var stringify = require('csv-stringify');
    
stringify(someData, {
    header: true
}, function (err, output) {
    fs.writeFile(__dirname+'/someData.csv', output);
})

Здесь мы импортируем ФС и CSV-Stringify модули. Затем, используя Stringify () Функция, мы поставляем данные, которые мы хотели бы преобразовать в строку. Мы также поставили объектный литерал, содержащий Заголовок вариант. Наконец, есть также функция обратного вызова, которая используется для записи содержимого в файл.

Другие варианты, такие как литой , Колонны и разделитель также доступны. В нашем случае мы устанавливаем Заголовок Вариант для правда Чтобы сказать «Строки», чтобы создать имена столбцов в первой записи.

Запуск этого кода генерирует файл с правильным содержимым:

Написание CSV в файл в Nodejs

Заключение

Узел-CSV Модуль – это набор меньших модулей, используемых для чтения/анализа, преобразования и записи данных CSV и файлам.

Мы использовали CSV-Parse Модуль для чтения файлов CSV и CSV-Stringify Модуль для уничтожения данных перед записью его в файл с помощью Node.js.