Unit 7. Чтение и запись CSV, JSON файлов в Node.js

Итак, в предыдущем уроке мы изучили как читать файлы — как выводить в консоль их содержимое, и даже записали несколько файлов. Настало время овладеть еще двумя кейсами — работой с JSON файлами в node.js и работой с CSV.

Записываем json файл в node.js

Здесь все довольно просто. Вот таким кодом мы делали запись:

const fs = require('fs');
const path = require('path');

fs.writeFile('newfile.txt', 'gooooooo\nooooooo', (err) => {
    if (err) console.log(err);
});

Ок. Что будет если мы попытаемся записать json файл?

Давайте возьмем для примера массив man:

const man = {
    "name": "Sara", 
    "age": 23, 
    "gender": "Female", 
    "department": "History", 
    "car": "Honda" 
} 

Преобразуем в json строку и запишем тем же методом, что и раньше.

let data = JSON.stringify(man);
fs.writeFileSync('man.json', data);

валидируем. Работает! Мы получили валидный json файл из массива с помощью node.js. Давайте теперь попробуем решить обратную задачу — как считать содержимое файла json в переменную. Это один из наиболее часто задаваемых вопросов при работе в javascript. Как только не мучаются фронтенд разработчики — все получается не очень, а все просто — чтение файлов прерогатива бекенда, итак, поехали...

Читаем файл json в node.js

Для начала комментируем предыдущую задачу, ведь мы не хотим, чтобы при запуске скрипта каждый раз перезаписывался файл man.json.

Теперь в нужном месте файла, там где мы хотим получить содержимое json напишем:

let jsonData = require('./man.json');
console.log(jsonData);

и мы получаем вывод:

{
  name: 'Sara',
  age: 23,
  gender: 'Female',
  department: 'History',
  car: 'Honda'
}

Если мы выведим тип полученных данных console.log(typeof jsonData), то увидим - object т.е. нам не нужно проводить дополнительных преобразований. Итак, прочитать файл json в node.js и получить его в переменную — одна строка.

Несколько слов о require – это команда, которая позволяет подключать модули в node.js. Причем как встроенные, так и самописные, или установленные. Мы уже применяли данную команду для подключения модуля:

const fs = require('fs');
const path = require('path');

файловой системы и для путей. Теперь — мы просто применили данную команду для подключения json файла.

Итак, мы овладели первым кейсом, теперь переходим ко второму — запись и чтение CSV файлов.

Чтение CSV в node.js

Несколько слов о нудной теории — CSV это формат текстового файла, который позволяет хранить структурированные значения в формате строк и колонок, а данные отделены определенным символом. Я специально не упоминаю comma – разделитель запятую, поскольку формат позволяет разделять данные пробелом, точкой с запятой или табуляцией.

Мы будем для чтения CSV использовать сторонний модуль. Да, можно и самому написать код, но идеология ноды — пакеты. Поэтому начнем. Для начала установим csv-parser.

npm i -s csv-parser

Обратите внимание, после выполнения команды у нас появилась папка node_modules где установлен csv-parser и необходимые зависимости. Да, иногда для одной операции в одну строку можно натянуть себе мегабайты пакетов.

После установки пакет нужно подключить. Надеюсь не забыли комментировать предыдущий код?

const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');

Теперь читаем файл ( кстати, пример взят из документации пакета сайта npmjs.com).

fs.createReadStream('table.csv')
    .pipe(csv())
    .on('data', (data) => results.push(data))
    .on('end', () => {
        console.log(results);
    });

И мы получаем в переменной result массив из файла table.csv.

[
  {
    Name: 'Sally Whittaker',
    Class: '2018',
    Dorm: 'McCarren House',
    Room: '312',
    GPA: '3.75'
  },
  {
    Name: 'Belinda Jameson',
    Class: '2017',
    Dorm: 'Cushing House',
    Room: '148',
    GPA: '3.52'
  },
  {
    Name: 'Jeff Smith',
    Class: '2018',
    Dorm: 'Prescott House',
    Room: '17-D',
    GPA: '3.2'
  },
  {
    Name: 'Sandy Allen',
    Class: '2019',
    Dorm: 'Oliver House',
    Room: '108',
    GPA: '3.48'
  }
]

Итак, плюс один кейс.

Запись CSV файла

Как вы уже поняли, мощь node.js заключена в модулях. Установим модуль 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')); 

результат — появление файла out.csv, открыв который увидим ожидаемую структуру. Остается проверить — открыть любым табличным редактором и убедиться что все работает.

Итак, мы овладели 4 основными кейсами работы с файлами — чтением и записью CSV и JSON файлов в Node.js.

Домашнее задание

Загрузка ДЗ на проверку возможна только после приобретения курса.

Task 1.

Создайте функцию f1, которая при запуске из массива ar1 создаем файл ar1.json в текущей папке.


const ar1 = {
    test: 1,
    code: 2
};

Напоминаю - больше данных по задаче, правильное написание и логика - в шаблоне!!!Сдаем на проверку - только app.js

Task 2.

Создайте функцию f2, которая при запуске из массива ar2 создаем файл ar2.json в текущей папке.

const ar2 = [1, 2, 3];
Task 3.

Создайте функцию f3, которая при запуске выводит содержимое файла j3.json в консоль.

Task 4.
Задача доступна после приобретения курса.
Task 5.
Задача доступна после приобретения курса.
Task 6.
Задача доступна после приобретения курса.
Task 7.
Задача доступна после приобретения курса.

Следи за новостями курсов на нашем канале

Открыть

Правила оформления домашних заданий

Открыть

Форум по задачам

Forum