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
Создайте функцию f1, которая при запуске из массива ar1 создаем файл ar1.json в текущей папке.
const ar1 = {
test: 1,
code: 2
};
Напоминаю - больше данных по задаче, правильное написание и логика - в шаблоне!!!Сдаем на проверку - только app.js
Создайте функцию f2, которая при запуске из массива ar2 создаем файл ar2.json в текущей папке.
const ar2 = [1, 2, 3];
Создайте функцию f3, которая при запуске выводит содержимое файла j3.json в консоль.