SPRINT 07 . Чтение и запись 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.

TASKS

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
Материалы юнита доступны после покупки курса