Como extrair dados do Excel (CSV) e usar no Ruby on Rails?

Você sabia que a linguagem Ruby possui uma biblioteca nativa para trabalhar com arquivos CSV (Comma Separated Value)? Se você respondeu não, então esse post é para você!

Desmistificando o CSV

Antes de mais nada, é importante saber que o CSV é apenas um arquivo de texto onde seu conteúdo é formado por linhas que possuem dados separados inicialmente por vírgula, e o melhor é que esse arquivo pode ser obtido a partir praticamente qualquer planilha do Excel. Vejamos um exemplo a partir da imagem abaixo:

Como podemos perceber, temos uma pequena tabela escrita no Excel e nosso exemplo vai consistir em levar esses dados para uma aplicação Rails que vamos construir.

Pois bem, de posse da planilha basta clicar em “Arquivo > Salvar como” e no momento em que for salvar o arquivo selecionar o tipo CSV (separado por vírgulas).

Após salvar, podemos verificar o conteúdo do arquivo clicando com o botão direito no mouse e em seguida apontando “Abrir com > Bloco de Notas”.

Executando o passo anterior, podemos analisar o conteúdo do arquivo .csv e conforme imagem abaixo, vemos que trata-se apenas de um arquivo de texto onde cada linha da planilha foi transformada em texto e cada coluna foi separado por “ponto e vírgula”, nesse caso.

É importante ressaltar que um arquivo CSV inicialmente é um arquivo onde os elementos que o compõe são separados por vírgula, mas o Excel tende a usar como separador o ponto e vírgula (o que é totalmente normal).

Os passos que fizemos acima foi no Sistema Operacional Windows, mas os mesmos passos podem ser feitos em outros Sistemas Operacionais com os devidos ajustes.

Primeiro teste

Agora que já conhecemos o que é um arquivo CSV podemos fazer um primeiro teste diretamente no IRB. Vejamos:

2.3.4 :001 > require 'csv'
=> true
2.3.4 :002 > CSV.foreach('dados.csv', col_sep: ';') do |linha|
2.3.4 :003 > p linha
2.3.4 :004?> end
["Nome", "Email", "Endereço"]
["Fulano", "[email protected]", "Rua A"]
["Cicrano", "[email protected]", "Rua B"]
["Beltrano", "[email protected]", "Rua C"]
=> nil
2.3.4 :005 >

Veja que fizemos o require da biblioteca padrão CSV, depois usamos o CSV.foreach informando o arquivo e o separador (col_sep: ‘;’) que o arquivo está utilizando. Com isso observamos que a saída foi um Array para cada linha e cada célula da linha ficou em uma posição do Array.

Vale ressaltar que caso precisemos do número da linha atual, podemos usar o complemento .with_index no momento da leitura. Veja:

2.3.4 :001 > require 'csv'
=> true
2.3.4 :002 > CSV.foreach('dados.csv', col_sep: ';').with_index do |linha, indice|
2.3.4 :003 > p indice
2.3.4 :004 > p linha
2.3.4 :005?> end
0
["Nome", "Email", "Endereço"]
1
["Fulano", "[email protected]", "Rua A"]
2
["Cicrano", "[email protected]", "Rua B"]
3
["Beltrano", "[email protected]", "Rua C"]
=> nil
2.3.4 :006 >

Fácil, não? Então agora é só colocar a mão na massa!

Criando a aplicação Rails, importando e vendo o resultado

Conforme dito anteriormente, vamos criar uma aplicação Rails e importar os dados do CSV para ela. Para isso, siga os passos:

  1. Crie a app
rails new exemplo_csv

2. Crie o scaffold (nesse caso, compatível com o arquivo)

rails g scaffold User name email address

3. Rode as migrações

rails db:create db:migrate

4. Copie o arquivo dados.csv para a pasta tmp da sua app Rails

5. Gere uma task para importar os dados

rails g task csv import

Nesse momento o arquivo /exemplo_csv/lib/tasks/csv.rake será criado.

6. Escreva a task

require 'csv'
namespace :csv do
desc "Importa o arquivo dados.csv"
task import: :environment do
CSV.foreach('tmp/dados.csv', col_sep: ';').with_index do |linha, indice|
unless (indice == 0)
User.create!(name: linha[0], email: linha[1], address: linha[2])
end
end
end
end

Acredito que com o que vimos anteriormente você entenda facilmente o código acima, visto que a única diferença é que usamos a posição do Array para buscar o nome (linha[0]), email (linha[1]) e endereço (linha[2]).

7. Rode a task

rails csv:import

Se tudo der certo, nesse momento você já pode levantar o servidor rails (rails s) e acessar a página http://localhost:3000/users para ver o resultado.

Muito simples, não é mesmo?

É isso, pessoal! Acredito que com esses poucos passos foi possível perceber como é simples o uso do CSV em conjunto com o Rails.

Até a próxima! 😉