Como ler arquivo CSV e salvar no banco de dados com Node.js


Neste tutorial, será apresentado como ler um arquivo CSV e salvar no banco de dados com Node.js.

Primeiramente, será mostrado como ler o conteúdo do arquivo Excel.

Em seguida, será apresentado como salvar no banco de dados as informações do arquivo CSV.

Por fim, será mostrado como bloquear o cadastro duplicado com Node.js.

Baixar o código fonte: Download

Full Stack: Curso de React e Node.js: Mais Detalhes do Curso

Como instalar o MySQL no Windows: Acessar

Como instalar o MySQL Workbench no Windows: Acessar

Como salvar log no Node.js: Acessar

Aulas gratuitas do curso de Node.js: Acessar


Para começar, é criado o arquivo "package.json" executando o comando "npm init" no terminal do editor ou no prompt de comando.

Em seguida, é instalada a dependência Express.

npm install express

Criado o arquivo "app.js" com as rotas raiz utilizando Express, e indicado para rodar o projeto na porta 8080.

// Incluir as bibliotecas
// Gerencia as requisições, rotas e URLs, entre outra funcionalidades
const express = require("express");

// Chamar a função express
const app = express();

// Criar a rota inicial
// Endereço para acessar: http://localhost:8080
app.get("/", (req, res) => {

    // Retornar a frase para a aplicação que fez a requisição da rota
    res.send("Página inicial.");
});

// Iniciar o servidor na porta 8080, criar a função utilizando modelo Arrow function para retornar a mensagem de sucesso
app.listen(8080, () => {
    console.log("Servidor iniciado na porta 8080: http://localhost:8080");
});

Instalada a dependência para ler CSV.

npm install csv

Incluída a dependência no arquivo 'app.js', também o módulo 'fs' para interagir com o sistema de arquivos.

// Incluir a biblioteca para ler o conteúdo do arquivo CSV
const csv = require('csv');
// Permite interagir com o sistema de arquivos
const fs = require('fs');

Na rota raiz, primeiro é indicado qual arquivo CSV deve ser utilizado; em seguida, é realizada a leitura e o resultado da leitura do arquivo CSV é impresso no terminal.

// Caminho para o arquivo CSV
const arquivoCSV = 'arquivo.csv';

// Ler o arquivo CSV
fs.createReadStream(arquivoCSV)

    // pipe - conectar fluxos de leitura e escrita, sem armazenar os dados intermediários em memória
    // columns: true - Primeira linha do arquivo CSV seja tratada como cabeçalho, o nome do cabeçalho corresponde o nome da coluna no banco de dados
    // Delimitador é ; (ponto e vírgula)
    .pipe(csv.parse({ columns: true, delimiter: ';' }))

    // Acionar o evento data quando ler uma linha e executar a função enviando os dados como parâmetro
    .on('data', async (dadosLinha) => {
        console.log(dadosLinha);   
    });

return res.send("Importação concluída.");

O próximo passo é salvar no banco de dados. Para isso, é necessário ter o banco de dados instalado na máquina. Caso não tenha, utilize como base o tutorial 'Como instalar o MySQL no Windows'. Por fim, crie a base de dados 'celke'.

CREATE DATABASE celke CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Para conectar o Node.js com o banco de dados MySQL, será utilizado o Sequelize. Para instalá-lo, é utilizado o comando:

npm install --save sequelize

Também instalado o driver do banco de dados MySQL.

npm install --save mysql2

Junto instalado o Sequelize-cli, que permite usar linha de comando para criar modelos, configurações e arquivos de migração para bancos de dados.

npm install --save-dev sequelize-cli

O primeiro comando a ser executado com Sequelize-cli é criar o arquivo de configuração no diretório de models, migrations, seeders e conexão com banco de dados.

npx sequelize-cli init

Em seguida, é criado o arquivo .sequelizerc responsável por indicar onde estão as models, migrations e seeders.

// Fornece utilitários para trabalhar com caminhos de arquivos e diretórios
const path = require('path');

// Exportar o caminho da conexão com banco de dados, models, seeders e migrations
module.exports = {
  'config': path.resolve('db', 'config', 'config.js'),
  'models-path': path.resolve('db', 'models'),
  'seeders-path': path.resolve('db', 'seeders'),
  'migrations-path': path.resolve('db', 'migrations')
}

Para armazenar as credenciais do banco de dados, serão utilizadas variáveis de ambiente. Para gerenciar essas variáveis, será utilizado o Dotenv. Primeiramente, a dependência é instalada.

npm install --save dotenv

Foi criado o arquivo '.env' com as variáveis de ambiente.

TZ=America/Sao_Paulo # Fuso horário utilizado no projeto

NODE_ENV=development # Ambiente do projeto
DB_HOST=localhost # Local do banco de dados
DB_BASE=celke # Base de dados
DB_USER=root # Usuário do banco de dados
DB_PASS= # Senha do banco de dados
DB_DIALECT=mysql # Tipo do banco de dados

Utilizadas as variáveis de ambiente no arquivo 'db/config/config.js', responsável por indicar os tipos de ambiente.

// Incluir o arquivo com as variáveis de ambiente
require('dotenv').config();

// Exportar as credenciais do banco de dados
module.exports = {
  "development": {
    "username": process.env.DB_USER,
    "password": process.env.DB_PASS,
    "database": process.env.DB_BASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_DIALECT
  },
  "test": {
    "username": process.env.DB_USER,
    "password": process.env.DB_PASS,
    "database": process.env.DB_BASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_DIALECT
  },
  "production": {
    "username": process.env.DB_USER,
    "password": process.env.DB_PASS,
    "database": process.env.DB_BASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_DIALECT
  }
}

No arquivo 'db/models/index.js', que possui a conexão com o banco de dados, foi alterado o arquivo responsável por indicar os tipos de ambiente.

const config = require(__dirname + '/../config/config.js')[env];

Também acrescentado o código para verificar se conseguiu realizar a conexão com o banco de dados.

// Verificar a conexão com banco de dados
sequelize.authenticate()
.then(() => {
  console.log("Conexão com o banco de dados realizado com sucesso!");
}).catch((error) => {
  console.log("Erro: Conexão com o banco de dados não realizado com sucesso!", error);
});

Em seguida, foi criada a migration. No tutorial 'O que é migrations e como usar migrations com Node.js,' apresento mais detalhes sobre por que usar migrações e como usá-las.

npx sequelize-cli model:generate --name Users --attributes cpf:string,nome:string,email:string,endereco:string

Ao executar o código acima, será criada a migration "db/migrations/data_nome_migration".

'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      cpf: {
        type: Sequelize.STRING
      },
      nome: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      endereco: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Users');
  }
};

O próximo passo é executar a migração para criar a tabela no banco de dados.

npx sequelize-cli db:migrate

Com a conexão do Node.js com o banco de dados MySQL realizada e a tabela criada utilizando a migração, na rota raiz do arquivo 'app.js', pode ser implementado o código para salvar o registro do CSV no banco de dados, importante incluir a conexão com banco de dados.

// Incluir a conexão com banco de dados
const db = require('./db/models');

// Cadastrar o usuário no banco de dados
await db.Users.create(dadosLinha);

Para cadastrar no banco de dados, é somente isso? Sim, mas pode ser acrescentada a restrição de cadastrar um único registro por CPF, verificando se o CPF já está cadastrado no banco de dados.

// Recuperar o registro do banco de dados
const user = await db.Users.findOne({

    // Indicar quais colunas recuperar
    attributes: ['id'],

    // Acrescentado condição para indicar qual registro deve ser retornado do banco de dados
    where: { cpf: dadosLinha.cpf }
});

// Acessa o IF quando o usuário não está cadastrado no banco de dados
if (!user) {
    // Cadastrar o usuário no banco de dados
    await db.Users.create(dadosLinha);
}

Baixar o código-fonte completo do projeto.

Bom, era isso. Espero que o tutorial tenha sido útil!