Importando um arquivo CSV para um Banco de Dados
Imagine que você está desenvolvendo um sistema de cadastro de clientes próprio e precisa popular sua base de dados com clientes já existentes em outro sistema?
Vai incluí-los manualmente?
Lógico que não. Uma solução para isto é você ir ao seu sistema original, onde estão os clientes, e exportá-los para um arquivo .CSV, claro, seu sistema antigo deve possuir tal funcionalidade, e então, importar este arquivo para dentro do seu sistema novo. Mas como fazer isso? É o que vamos ver no post de hoje.
Importando um arquivo CSV para um Banco de Dados
No post de hoje vamos trabalhar com três grandes funcionalidades do Code Igniter. Vamos aprender a como enviar um arquivo, helper upload, depois como tratar este arquivo, helper file e por fim inserir os dados tratados em um banco de dados, biblioteca database.
Por isso, vamos dividir o post em três etapas.
1) Carregar o helper upload e fazê-lo funcionar enviando arquivos
2) Tratar o arquivo enviado.
3) Inserir os dados no banco de dados.
Etapa 1) Helper upload. Enviando arquivos
Só passe para a próxima etapa, quando a anterior estiver funcionando e também certifique-se de ter entendido tudo.
Crie um arquivo chamado upload_form.php dentro da pasta application/views, e dentro dele cole o seguinte conteúdo:
<html> <head> <title>Formulário de Upload</title> </head> <body> <?php echo $error;?> <?php echo form_open_multipart('upload/do_upload');?> Arquivo: <input type="file" name="userfile" size="20" /> <br /><br /> <input type="submit" value="Enviar" /> </form> </body> </html>
Agora, crie um outro arquivo dentro desta mesma pasta chamado upload_success.php com o seguinte conteúdo:
<html> <head> <title>Arquivo enviado com sucesso</title> </head> <body> <h3>Seu arquivo foi enviado com sucesso!</h3> <ul> <?php foreach ($upload_data as $item => $value):?> <li><?php echo $item;?>: <?php echo $value;?></li> <?php endforeach; ?> </ul> <p><?php echo anchor('upload', 'Enviar outro arquivo!'); ?></p> </body> </html>
Estes arquivos que criamos são as views que são a parte visual do site.
Vamos agora criar o controller que cuidará do recebimento do arquivo.
Para isto, abra a pasta application/controllers e crie um arquivo de nome upload.php com o seguinte conteúdo:
<?php class Upload extends CI_Controller { function __construct() { parent::__construct(); $this->load->helper(array('form', 'url')); } function index() { $this->load->view('upload_form', array('error' => ' ' )); } function do_upload() { $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '100'; $config['max_width'] = '1024'; $config['max_height'] = '768'; $this->load->library('upload', $config); if ( ! $this->upload->do_upload()) { $error = array('error' => $this->upload->display_errors()); $this->load->view('upload_form', $error); } else { $data = array('upload_data' => $this->upload->data()); $this->load->view('upload_success', $data); } } } ?>
Uma pequena explicada em cada função:
A função __construct() é a função de construção das classe. Tudo que estiver digitado ali dentro será executado por primeiro.
Repare que dentro desta função existe uma linha que está carregando dois helpers, o helper form e o helper url.
A função index() é a que chama a view upload_form que é nossa tela inicial.
A função do_upload() é a função que vai receber o arquivo enviado. Ali dentro existem basicamente os parâmetros de configuração do helper, como:
em qual pasta os arquivos serão enviados
que tipos de arquivos serão permitidos
o tamanho máximo em kB
a largura e altura máxima, no caso para imagens.
Se for enviar outros tipos de arquivo, as configurações como largura e altura podem ser eliminadas.
Após estas configurações, existe uma linha que carrega a biblioteca de upload:
$this->load->library('upload', $config);
e vincula à ela as configurações dentro da array $config[];
Após isso, ele chama uma função que faz o upload e verifica se tudo deu certo. Caso sim, ele chama a view de sucesso, upload_success e caso dê algum erro, ele chama novamente a view inicial, porém, passando agora informações dentro da variável error, para mostrar ao usuário que tipo de erro ele cometeu.
Repare que os erros que são repassados à view são fornecidos pelo próprio helper de upload. A linha:
$this->upload->display_errors()
retorna o erro que ocorreu e com isto você pode mostrá-lo ao seu usuário.
Antes de executar os testes, você precisa criar uma pasta chamada uploads na raíz do Code Igniter, e precisa dar permissão 777 caso esteja no Linux. É nesta pasta que os arquivos ficarão armazenados.
Outra coisa também é informar ao Code Igniter que deve carregar agora o controller upload em vez do welcome.
Para isto, abra o arquivo routes.php que está dentro da pasta: application/config e procure pela linha:
$route['default_controller'] = "welcome";
Troque a palavra welcome por upload, ficando assim:
$route['default_controller'] = "upload";
Após feito isso, você já pode testar seu formulário. Tente enviar um arquivo de imagem e veja se tudo funciona.
Faça testes também para ver as mensagens de erro.
Você vai reparar que os erros aparecem em inglês. Para você traduzi-los é muito simples. Basta acessar o arquivo de erros dentro do seguinte caminho:
system/language/english/upload_lang.php
Dentro deste arquivo estão todas as mensagens de erro possíveis deste helper.
Se tiver certeza que tudo está funcionando, você agora pode passar para a etapa 2. Tratando o arquivo
Etapa 2) Tratando o arquivo enviado
Nesta etapa nós já temos a posse do arquivo enviado e vamos tratar seu conteúdo.
Uma alteração importante a fazer antes de continuarmos, é na linha onde é informado quais tipos de arquivos são permitidos. Ali vamos fazer uma alteração para dizer que qualquer tipo de arquivo pode ser enviado, ou se você quiser, pode colocar somente arquivos do tipo .CSV.
Para aceitar todos os tipos de arquivos, deixe a linha como segue abaixo:
$config['allowed_types'] = '*';
Colocando um asterisco, o Code Igniter entende que qualquer tipo de arquivo é aceito no upload.
Agora, você deverá substituir o código que está no ELSE da função do_upload. Aquela parte onde ele verifica se não há erros e envia o arquivo.
Substitua todo o conteúdo do else pelo novo código abaixo. Veja a explicação ao lado de cada linha de código:
$this->load->helper('file'); //carrega o helper file, que é o responsável por trabalharmos com arquivos $this->load->database(); //carrega o banco de dados. Mas antes, você deverá criar um banco e uma tabela. Veja no final o código da tabela. $dados = $this->upload->data(); //esta linha atribui à variável $dados o conteúdo que foi enviado do formulário $arquivo = fopen($dados['full_path'], "r"); //aqui, abrimos o arquivo em modo leitura através da função fopen. Repare que em $dados['full_path'] é que está o caminho completo ao arquivo. $linha = 1; //variável de controle while (($data = fgetcsv($arquivo, 1000, ",")) !== FALSE) { //este while vai percorrer o arquivo aberto linha por linha e a cada linha lida, executa o código abaixo if ($linha++ == 1) //este IF tem como função pular a primeira linha do arquivo .CSV, pois ali constam os nomes dos campos, que não nos interessam. continue; //Aqui a montagem da SQL. Como o WHILE move o ponteiro para cada linha, e como temos somente 2 campos, podemos acessar o primeiro campo daquela linha lida como $data[0], e o segundo campo como $data[1], que correspondem ao campo nome e email. $dados = array( "nome" => $data[0], "email" => $data[1] ); $this->db->insert("cad_clientes", $dados); //agora, basta inserirmos o conteúdo no banco de dados. Ele vai executar isto para cada linha lida do arquivo .csv. } fclose ($arquivo); //fechamos o arquivo para liberar a memória. $variaveis['upload_data'] = $this->upload->data(); $this->load->view('upload_success', $variaveis);
Para executar o código acima, você precisa antes criar um Banco de Dados, uma tabela e configurar o CodeIgniter para isto.
Crie um banco de dados qualquer e uma tabela. Se quiser, segue o código abaixo da tabela que criei:
CREATE TABLE IF NOT EXISTS `cad_clientes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;
Se você não se lembra como configurar um Banco de Dados no Code Igniter. Clique aqui e veja como.
Se você não conseguiu fazer por algum motivo, abaixo você pode baixar o nosso tutorial e ver como tudo funciona.
Baixar o Importador de CSV para SQL.
Por hoje é só. Qualquer dúvida ou sugestão, deixe seu comentário abaixo.
Abraços