Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cadmiel

Como importar dados CSV para MySQL usando php

Recommended Posts

Boa tarde galera

 

Gostaria de saber como faço para importar dados do CSV(excel) para Mysql usando PHP ?

 

lembrando gente que na hora da importação no sql já quero definir as colunas e o nome da tabela(entidade)

 

onde devera ser armazenado.

 

Se alguém puder me ajudar eu agradeço ?

 

Grato

Cadmiel Jorge

Tempo de Evangelizar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o phpmyadmin,

 

Procure import, CVS

Importe o arquivo cvs

Depois vai outra vez em import, cvs usando load data para poder carregar os dados.

 

 

Algumas versões mais velhas do phpmyadmin não da para importar cvs.

 

 

 

E o tópico está no forum errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara eu to querendo importar usando PHP

 

da uma olhada no que eu ja consegue

 

 

$handle = fopen('planilha.csv','r');

 

while(($data = fgetcsv($handle, 1000, ",")) !== false){

 

$num = count($data);

 

for ($c=0; $c<$num; $c++){

 

$id = $data[0];

$nome = $data[1];

$email = $data[2];

 

require_once('Connections/ConnDB.php');

mysql_select_db($database_ConnDB, $ConnDB);

$sql = 'insert into tabeladois (id,nome,email) values (null,$nome,$email)';

$Recordset1 = mysql_query($sql, $ConnDB) or die(mysql_error());

//$mysql_query($sql);

}

}

fclose($handle);

 

So que não estou conseguindo pegar os dados que estão no documento planilha.csv

 

Por favor me ajudem

grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara eu to querendo importar usando PHP

 

da uma olhada no que eu ja consegue

 

 

$handle = fopen('planilha.csv','r');

 

while(($data = fgetcsv($handle, 1000, ",")) !== false){

 

$num = count($data);

 

for ($c=0; $c<$num; $c++){

 

$id = $data[0];

$nome = $data[1];

$email = $data[2];

 

require_once('Connections/ConnDB.php');

mysql_select_db($database_ConnDB, $ConnDB);

$sql = 'insert into tabeladois (id,nome,email) values (null,$nome,$email)';

$Recordset1 = mysql_query($sql, $ConnDB) or die(mysql_error());

//$mysql_query($sql);

}

}

fclose($handle);

 

So que não estou conseguindo pegar os dados que estão no documento planilha.csv

 

Por favor me ajudem

grato

 

Eu já passei para o bd uma tabela em html.

 

Agora arquivo cvs deve ser mais tranquilo.

 

Com o comando explode

 

Usando o comando explode da para criar um array bidimensional,

 

Ai passa esse arrray para o bd.

 

Mas ou menos assim

$array1 = explode("\n" , $seuarquivocvs );
$array2d = array();

for($i = 0; $i <= count($array1) ; $i++){
$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];
$array2d[$i][2] = $array2[2]; }
for($i = 0; $i <= count($array2d) ; $i++){
$query = "INSERT INTO tabelacvs ('c0','c1','c2') VALUES ('".$array2d[$i][0]."' , '".$array2d[$i][0] ."' , '".$array2d[$i][0] ."') 
} 


 

 

Deve ter uns errinhos mas eu faria assim

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa tarde galera tô na mesma pendenga, fiz esse script, ele gera o código de inscerção corretíssimo porém os dados naum saum inseridos segue:

 

 

<?
function valores($vai, $arquivo){
echo $vai;
$handle = fopen ($arquivo,"r");

echo "VALUES ";
//obtendo o número de repetições
$num = "";
while (($data = fgetcsv($handle, 1000, ","))!== FALSE){$num++;}

//inserindo vírgulas , parenteses e ponoto-e-vírgul de acordo com a necessidade
while (($data = fgetcsv($handle, 1000, ","))!== FALSE) {
$this -> $num;
$arr1 = array(";",",");
$arr2 = array(",","','");
   $var = str_replace($arr1,$arr2,$data);
echo $num;
   for ($c=0; $c < $num; $c++) {
       echo "('" . $var[$c];
	if (fgetcsv($handle, 1000, ",","\'")!==FALSE){echo "'),";} else {echo "');";}
   }

}
//fechando doc
fclose ($handle);

}
?>


<table width="400" border="1" cellspacing="0" cellpadding="0">
 <tr>
   <td>Cabeçalho</td>
 </tr>
 <tr>
   <td><table width="400" border="1" cellspacing="0" cellpadding="0">
     <tr>
       <td><form enctype="multipart/form-data" action="" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
</td>
     </tr>
     <tr>
       <td bgcolor="#999999"><?php

$uploaddir = 'C:/apache2triad/htdocs/teste/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
   print "banco atualiuzado:\n";
   print_r($_FILES);
} else {
   print "é mermão a bagaça falhou:\n";
   print_r($_FILES);
}
print "</pre>";
?>

</td>
     </tr>
     <tr>
       <td bgcolor="#999999">
      </td>
     </tr>
   </table></td>
 </tr>
 <tr>
   <td bgcolor="#0099CC"><?php 
$query = valores($vai,$_FILES['userfile']['name']);
$str = string($query);
$testeup = mysql_query($str,$teste) or die("deu problema " . error_reporting(E_ALL));


echo $vai . $query or die("nada");


?></td>
 </tr>
</table>










Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já passei para o bd uma tabela em html.

 

Agora arquivo cvs deve ser mais tranquilo.

 

Com o comando explode

 

Usando o comando explode da para criar um array bidimensional,

 

Ai passa esse arrray para o bd.

 

Mas ou menos assim

$array1 = explode("\n" , $seuarquivocvs );
$array2d = array();

for($i = 0; $i <= count($array1) ; $i++){
$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];
$array2d[$i][2] = $array2[2]; }
for($i = 0; $i <= count($array2d) ; $i++){
$query = "INSERT INTO tabelacvs ('c0','c1','c2') VALUES ('".$array2d[$i][0]."' , '".$array2d[$i][0] ."' , '".$array2d[$i][0] ."') 
} 


 

 

Deve ter uns errinhos mas eu faria assim

 

 

 

Cara fiz aqui o que você disse porém até o momento não deu certo

a questão é que ele não insere registro no banco de dados.

alguém conseguem ai ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ve ai o erro que da, eu nem coloquei aquelas aspas tortas. Imprime a query nos fors para ver se ta tudo certo. E tambem eu nao me lembro da separacao no cvs, da uma olhada nos explodes eu coloquei no primeiro "/n" e no segundo ";", abre um cvs no notepad e ve

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ve ai o erro que da, eu nem coloquei aquelas aspas tortas. Imprime a query nos fors para ver se ta tudo certo. E tambem eu nao me lembro da separacao no cvs, da uma olhada nos explodes eu coloquei no primeiro "/n" e no segundo ";", abre um cvs no notepad e ve

 

 

 

 

 

Até agora nada, tipo tem como você fazer ai e testar e postar ele aqui no forum se você puder comentar cara pra gente não so copiar mas tb entender cara agradeço vlw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até agora nada, tipo tem como você fazer ai e testar e postar ele aqui no forum se você puder comentar cara pra gente não so copiar mas tb entender cara agradeço vlw.

 

 

 

Esse script não tava funcionando mas a ideia é a mesma.

 

E também eu esqueci de execultar a query,

 

Eu só criei uma variavel chamada $query mas não execultei,

E também não funcionava direito,

 

Ai eu refiz uma parte.

 

<?php




 	$mysql_connect = mysql_connect("localhost", "root" , "" )	;
mysql_select_db("test", $mysql_connect);

$texto = "sdfsdfsdf;sdfsdf;sdfsfd
sdfsdf;fdfdf;fdfdf
fdfdf;fdfdfdsf;asdf
fdfdf;fdfsd;dsdf
sdfsdff;ffs;fsddda
sdfsdf;fdfxxdfs;dfsdy,yfsf";


 $array1 = explode("\n" , $texto );
 $array2d = array();
 print_r($array1);
 echo "<BR>";

 for($i = 0; $i <= count($array1) ; $i++){

$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];
$array2d[$i][2] = $array2[2]; }

print_r($array2d);

for($i = 0; $i <= count($array2d) - 1; $i++){
$query = "INSERT INTO `test`.`tabelacvs` (`c1`, `c2`, `c3`) VALUES ('".$array2d[$i][0]."', '".$array2d[$i][1]."', '".$array2d[$i][2]."');" ;

echo $query . "<BR>" ;
mysql_query($query);
}

?>

 

 

Primeiro para fazer um script assim é saber como é um arquivo cvs

 

 

sdfsdfsdf;sdfsdf;sdfsfd
sdfsdf;fdfdf;fdfdf
fdfdf;fdfdfdsf;asdf
fdfdf;fdfsd;dsdf
sdfsdff;ffs;fsddda
sdfsdf;fdfxxdfs;dfsdy,yfsf

 

Só tem um problema:

 

O arquivo pode conter um ; numa coluna sem ser para separação,

 

caso tenha um ponto e virgula, toda a parte que tem esse ponto e virgula, vai ter tudo entre aspas, exemplo

 

Numa linha

 

sdfsdf;"fdfx;xdfs";dfsdy,yfsf

 

entendeu?

 

para espar tenta fazer algo como um caractere de escape.

 

exemplo \5454621686216846246216 e tirar as aspas.

 

Sugiro que crie um novo tópico para ver como escapar o ponto e virgula.

 

 

Nesse meu script se tiver um ponto e virgula numa dessas "variaveis" vai bugar o script todo.

 

Se quizer tentar escapar isso use o str_replace nas querys

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o conteúdo do arquivo que você quer importar e gravar no banco de dados. Facilita para ver como esta a estrutura de armazenamento e a partir daí definir um script que faça o que você quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o conteúdo do arquivo que você quer importar e gravar no banco de dados. Facilita para ver como esta a estrutura de armazenamento e a partir daí definir um script que faça o que você quer.

 

É cvs(separado por espaço(linhas), e virgula(colunas).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá cadmiel.

 

Certifique-se de que o arquivo CSV foi salvo com "separado por vírgulas", pois neste formato é colocado um ";" (ponto e vírgula) separando as colunas.

 

Abra o arquivo com:

$arquivo = fopen($arquivo, "r");

 

e Assim você lê linha por linha do arquivo (cada coluna será um índice da array $linha):

while ($linha_arquivo = fgets($arquivo)) {
    $linha = explode(";",$linha_arquivo);
    $coluna1 = $linha[0];
    $coluna2 = $linha[1];
}

 

Lembrando que na primeira vez que passar o loop, a linha lida será a dos cabeçalhos da planilha: "id", "nome", "email";

 

Se não quiser ler esta linha, pode colocar um contador para executar a leitura das colunas a partir na segunda linha.

Exemplo de leitura de um arquivo CSV recebido por uma formulário, neste script, primeiro grava-se o arquivo no servidor e depois lê:

 

// SALVA O ARQUIVO RECEBIDO PELO FORMULÁRIO PELO CAMPO "arquivo" NO SERVIDOR
if (copy($arquivo,"import/".$arquivo_name)){

   $caminho = "import/";
   $abre_arquivo = $caminho.$arquivo_name;

   // ABRE ARQUIVO
   $arquivo = fopen($abre_arquivo, "r");

   // CONTATDOR PARA PULAR A PRIMEIRA LINHA
   $qtd = 0;

   // LÊ LINHA POR LINHA
   while ($linha_arquivo = fgets($arquivo)) {
       // DIVIDE COLUNAS SEPARADAS POR ;
       $linha = explode(";",$linha_arquivo);

       // VERIFICADOR PARA LER A PARTIR DA SEGUNDA LINHA    
       if ($qtd>0){

           // RESGATA VALORES
           $id    = $linha[0];
           $nome  = $linha[1];
           $email = $linha[2];

       } // Fecha Qtd
       $qtd++;
   } // fecha WHILE linha_arquivo
   // FECHA ARQUIVO
   fclose($arquivo);

}

 

Espero que tenha ajudado.

 

Abs

Anderson Amorim

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal consegue resolver...rs Obrigados a todos pelo feedback porem temos um novo desafio...rs

segue abaixo o codigo para você importar uma .cvs para o mysql

 

<?php

 

//include "ConectaBanco.class.php";

 

require_once('Connections/conexao.php');

 

//$conectar = new ConectaBanco();

 

$arquivocsv = "arquivocsv.csv";

$tabela = "dados";

 

$handle = file($arquivocsv);

 

for ($i=1;$i<count($handle);$i++)

{

$valori = explode(";", $handle[$i]);

$values = "";

foreach ($valori as $val)

{

$val=trim($val);

if (eregi("NULL",$val) == 0)

$values .= "'".addslashes($val)."',";

 

else

 

$values .= "NULL,";

}

 

$values = trim(substr($values,0,-1));

 

mysql_select_db($database_conexao, $conexao);

 

 

$query = "INSERT INTO $tabela VALUES (null, ".trim($values).");";

$Recordset1 = mysql_query($query, $conexao) or die(mysql_error());

 

 

}

 

?>

 

 

 

Meu Desafio agora é o seguinte é fazer com que os registros não se dupliquem visto

que sempre que eu executar o script acima ele insere gostaria de saber como faço para antes verificar

se os registros da planilha ja está cadastrado no banco de dados, qual a melhor forma para se fazer isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz um SELECT antes do INSERT, se mysql_num_rows for 0, execute o INSERT.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz um SELECT antes do INSERT, se mysql_num_rows for 0, execute o INSERT.

 

 

Então o problema é o seguinte vamos imaginar que tenha la na minha planilha um registro

 

felipe cardoso e alterei para felipe cardoso dos santos se eu usar o where

 

não vai dar certo, entende ? ele vai achar q felipe cardoso dos santos é novo registro

 

na hora de importar não vai alterar simplesmente vai inserir.

 

e ai alguem tem ideia de como fazer ?

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então o problema é o seguinte vamos imaginar que tenha la na minha planilha um registro

 

felipe cardoso e alterei para felipe cardoso dos santos se eu usar o where

 

não vai dar certo, entende ? ele vai achar q felipe cardoso dos santos é novo registro

 

na hora de importar não vai alterar simplesmente vai inserir.

 

e ai alguem tem ideia de como fazer ?

 

Grato

 

E só usar o UPDATE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Amigos.

 

E onde posso resgatar a variável do formulário em GET ou POST, para executar dentro da estrutura acima?

Compartilhar este post


Link para o post
Compartilhar em outros sites

este:

while(($data = fgetcsv($handle, 1000, ",")) !== false){

 

por este:

while(($data= fgetcsv($handle, 1000, ";")) !== false){

Colocar o ";" dai funciona perfeito!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.