PHP - LENDO ARQUIVOS CSV COM A FUNÇÃO fgetcsv
O PHP possui muitas funções pouco conhecidas mas que quebram um galhão na hora de fazer algo rapidamente e com poucas linhas.
Ler e parsear um arquivo no formato CSV pode ser bem chato mas com a função fgetcsv se torna bem tranquilo.
Podemos dizer que utilizar funções nativas ao invés de cria-la no próprio script é muito mais eficiente e rápido, tanto na questão da velocidade de se programar quanto na execução. Procure sempre utilizar as funções nativas.
Vamos começar criando um script muito simples apenas para ilustrar como a função fgetcsv funciona e depois daremos uma solução completa para ler um arquivo e convertê-lo em array.
Vamos trabalhar com um arquivo chamado "test.csv" com a seguinte estrutura:
nome;idade
Joao;25
carlos;50
O script básico é o que segue abaixo:
<?php
$handle  = fopen("test.csv", "r");
$linha   = fgetcsv($handle, 1000, ";");
 
var_dump($linha);
O resultado será:
array(2) {
 [0]=>
 string(4) "nome"
 [1]=>
 string(5) "idade"
}
Ou seja, apenas a primeira linha foi lida
Segundo a documentação oficial
http://php.net/manual/en/function.fgetcsv.php
fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' )
resource $handle é o ponteiro do arquivo "test.txt", $length é a quantidade de caratreres a serem lidas por linha. $delimiter é o marcador de limite entre os campos. Em nosso caso o ponto e virgula ";".
Vamos modificar um pouco o script para que possamos ler todas as linhas do arquivo:
<?php
$handle = fopen("test.csv", "r");
 
while  ($linha  = fgetcsv($handle, 1000, ";"))  {
 
 var_dump($linha);
 
}
O resultado será:
array(2) {
  [0]=>
  string(4) "nome"
  [1]=>
  string(5) "idade"
}
array(2) {
  [0]=>
  string(7) "Joao"
  [1]=>
  string(2) "25"
}
array(2) {
  [0]=>
  string(11) "Carlos"
  [1]=>
  string(2) "50"
}
O "while" move o ponteiro pelo handler do arquivo e lê cada uma das linhas e o fgetcsv parseia  esta linha.
Se quisermos inserir em uma única array o arquivo inteiro temos de fazer uma nova modificação:
<?php
$handle  = fopen("test.csv", "r");
$arquivo = Array();
 
while  ($linha   = fgetcsv($handle, 1000, ";"))  {
 
 $arquivo[] = $linha;
 
}
 
var_dump($arquivo);
O resultado é:
array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "nome"
    [1]=>
    string(5) "idade"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "Joao"
    [1]=>
    string(2) "25"
  }
  [2]=>
  array(2) {
    [0]=>
    string(11) "Carlos"
    [1]=>
    string(2) "50"
  }
}
Está bem mais interessante agora. Mas podemos melhorar ainda mais. Como podemos ver a primeira linha contém os nomes dos campos. O ideal é passar estes "titulos" mapeados dentro da array.
<?php
 $handle  = fopen("test.csv", "r");
 $arquivo = Array();
 $campo = Array();
 $count  = 1;
 
 while  ($linha = fgetcsv($handle, 1000, ";"))  {
 
  if  ($count == 1)  {
     
   $campo = $linha;
     
  }  else  {
    
   $arquivo[] = array_combine($campo, $linha);
  
  }
  
  $count++;
 
 }
 
 var_dump($arquivo);
Lemos a primeira linha e a transformamos em array com os campos. As demais linhas são as informações. Utilizamos a função "array_combine" para ligar os campos com sua respectiva informação.
O resultado é:
array(2) {
  [0]=>
  array(2) {
    ["nome"]=>
    string(7) "Joao"
    ["idade"]=>
    string(2) "25"
  }
  [1]=>
  array(2) {
    ["nome"]=>
    string(11) "Carlos"
    ["idade"]=>
    string(2) "50"
  }
}
Então é isso pessoal.
 
 
Boa tarde estou tendo dificuldades para importar csv de 14MB o navegador trava, não teria uma função para deixar o navegador e o servidor das uma respirada, atualmente estou dividindo o arquivo em pequenos pedaços
ResponderExcluirObrigado
Olá Geovan
ResponderExcluirVc pode tentar colocar no inicio de seu script:
ini_set('memory_limit', '20000M');
ou alterando o parametro memory_limit de seu arquivo php.ini
Abraço
Olá, Estou com dificuldade em relação ao uso de aspas duplas nos campos. Quando uso ocorre um erro na função array_combine() dizendo que os parâmetros devem ter o mesmo numero de elementos.
ResponderExcluirComo proceder neste caso?
Obrigado
Olá Diogo
ExcluirEstes problemas de aspas geralmente é na tentativa e erro mesmo que se resolve. Tente escapar as aspas duplas - addslashes()
Olá estou tentando ler um aquivo que possui 140 linhas, mas nao está dando certo, só consigo ler 15, será que vcs poderiam me ajudar?
ResponderExcluiraqui está o meu codigo
ResponderExcluirhttp://nopaste.info/8e18f976bb.html
Tutorial passo a passo de como efetuar a leitura de arquivos CSV de foma fácil:
ResponderExcluirhttp://www.mestredev.com.br/leitura-de-arquivos-csv-com-php/