Jump to content


Photo

Import .csv To Mysql


  • Faça o login para participar
6 replies to this topic

#1 Cassapava

Cassapava

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 09/05/2008, 13:25

Boa tarde pessoal!

Tenho pesquisado na internet uma maneira para importar dados de uma tabela excel para o banco (mysql), então achei várias soluções. Uma delas consiste em transformar os arquivos .xls em .csv então com um script em php enviá-los ao mysql.

O problema é que nos scripts que eu tenho os dados sempre são importados com um algarismo especial junto, aquele algarismo de parágrafo.. eh como se eu inserisse um dado e junto fosse um parágrafo, então no banco ele insere um caracter especial.
Já abri o código e tentei modificar mas o caracter especial sempre fica lá.

Já consegui efetuar essa tarefa com sucesso de outras maneiras, mas estas não atendem minhas necessidades, ou dá problema com o id que não pode ser auto incremento e tem q ser varchar ou então eu tenho q criar o sql fazendo o dump e criando um if para verificar se a tabela existe, apaga-la e recria-la

A tabela tem q ser criada somente uma vez, e então o script php deve ler e inserir os dados que estão nas linhas do arquivo .csv ou .xls

Vou postar um dos scripts que eu tenho aqui.. esse é o mais simples..

$host = "localhost";
$user = "root";
$pass = "senha";
$banco = "nome_banco";

$con = mysql_connect($host, $user, $pass);
mysql_select_db($banco, $con);

 $handle = fopen("arquivo.csv", "r");

if ($handle) { 
 $array = explode("\n", fread($handle, filesize("arquivo.csv"))); 
}  $total_array = count($array);

$i = 0;

while($i < $total_array) {

$data = explode(",", $array[$i]);


$sql = "SELECT * FROM `tabela` WHERE campo='" . $data[0] . "' LIMIT 1";

$result = mysql_query($sql);

if(mysql_num_rows($result) == 0) {

$valor = $data[0];

mysql_query("insert into tabela values (null, '$valor')");


}

$i++;
}

Se alguém puder ajudar-me ou indicar um tutorial p mim ver..

Desde já grato pela atenção!

Att
Junior

#2 GGSP

GGSP

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 09/05/2008, 15:02

Ola Junior, eu estou com um problema parecido, tenho a tabela tudo certinho, só que ao inves de apagar a tabela ou criar eu quero apenas adicionar o conteudo do csv pra ela, pode me ajudar ?

$taconvidado é a variavel que armazena a minha conexao com o banco de dados...

<? 
mysql_select_db($database_taconvidado, $taconvidado);


$insert_csv="LOAD DATA LOCAL INFILE 'planilha.csv' INTO TABLE news FIELDS TERMINATED BY ','";
$result_csv = mysql_query($insert_csv, $taconvidado) or die("NÃO VIROU... " .mysql_error());

if ($result_csv) {
$status.=" E AGORA IMPORTADO PARA A BASE DE DADOS";
} else {
$status.=" MAS NÃO FOI POSSIVEL COLOCAR NA BASE DE DADOS";
}
else {
$status.="... O ARQUIVO NAO FOI COPIADO";
}
echo "$status";
else {
echo "ARQUIVO MUITO GRANDE";
}?>

Edição feita por: GGSP, 09/05/2008, 15:03.


#3 Cassapava

Cassapava

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 09/05/2008, 16:40

Olá GGSP,

não consegui executar seu script, tenho outros aqui mas cada um apresenta um errinho diferente..

tenho um script que gera o sql direitinho.. exemplo:

insert into tabela values (null, 'valor1, 'valor2');
insert into tabela values (null, 'valor3, 'valor4');

o problema que no mysql dá erro na hora de inserir isso, para inserir os valores assim tem q fazer o dump...


-- MySQL Administrator dump 1.4
--
-- ------------------------------------------------------
-- Server version	5.0.51a-community-nt


DROP TABLE IF EXISTS `dos`;
CREATE TABLE `dos` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `nome` varchar(45) NOT NULL,
  `endereco` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*!40000 ALTER TABLE `dos` DISABLE KEYS */;

insert into tabela values (null, 'valor1, 'valor2');
insert into tabela values (null, 'valor3, 'valor4');

/*!40000 ALTER TABLE `dos` ENABLE KEYS */;

mais ou menos assim funciona..

mas to tentando fazer inserindo apenas o insert mas que os dados no banco fiquem certos (apesar de ter várias soluções pra isso na net está meio complicado de fazer).

#4 GGSP

GGSP

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 09/05/2008, 17:45

consegui cassapava, ele ta fazendo o upload, porem eu mando abrir o arquivo atraves do caminho absoluto, porque ja sei que o arquivo vai ficar com aquele nome, ele esta importando certinho, porém no final do campo telefone ele acrescenta um caracter especial de "espaço em branco" tipo aqueles do word sabe? parace um P invertido com a cabeça pintada ehehehe... pra vc entender, segue abaixo o codigo - se souber como tiro, e puder me ajudar....como ela ta no final ainda o recordset ta normal, porem nao sei se no futuro isso pode prejudicar o banco....

<?php require_once('Connections/taconvidado.php'); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>

<?php

$target_path = 'D:';

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
$_FILES['uploadedfile']['tmp_name'];
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
	echo "O arquivo ".  basename( $_FILES['uploadedfile']['name']). 
	" foi importado corretamente <br><br>";
	
	$fp = fopen('D:\planilha.csv', 'r'); 
   
	$inseridos = 0;	
	while($dados = fgets($fp)){		
		
	$registros = explode(';',$dados);		

	$sql_insert = "INSERT INTO news (nome, email, telefone) VALUES('" . $registros[0] .  "', '" . $registros[1] .  "', '" . $registros[2] . "')";
		print($dados."<br>");		
		
		if(mysql_query($sql_insert)){			
		$inseridos++;		
		} else {			
		print "Impossível inserir no banco de dados. Erro: " . mysql_error()."<br>";		
		}			
	
		 
		}
	
	
} else{

	echo "Erro ao importar o arquivo, tente novamente!!!";
}

echo "<br> Foram inseridos " . $inseridos . " novo cadastros <br>";

?>


</body>
</html>

vamos nos ajudando ehehehe... abraços

#5 Cassapava

Cassapava

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 12/05/2008, 16:03

Caro GGSP,

tenho acompanhado a sua agonia nos diversos fóruns da web.. kkkkkk

Após 2 semanas tentando, consegui fazer oq eu queria, acredito que também seja solução pra vc..

Abaixo o código completo funcionando..


index.php
<?php

include "ConectaBanco.class.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));

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

mysql_query($query);

}

?>


ConectaBanco.class.php
<?php

class ConectaBanco
{
var $host = "localhost";
var $user = "root";
var $pass = "senha";
var $base = "base";
var $link = "";


function ConectaBanco()
{
$this -> Conectar();
}


function Conectar()
{
$this -> link = mysql_connect($this -> host, $this ->user, $this ->pass);

if (!$this ->link)
{
die ("Erro ao conectar.");
}
elseif (!mysql_select_db($this ->base, $this ->link))
{
die ("Erro ao selecionar banco.");
}
}

}
?>


a estrutura da tabela na base de dados é a seguinte..

1 campo id, inteiro e de auto incremento
1 campo nome, varchar
1 campo telefone, do tipo numérico
1 campo email, do tipo varchar
1 campo endereço, varchar

a planilha csv está organizada da seguinte maneira:

nome | telefone | email | endereco

nome1 | tel1 | mail1 | end1
nome2 | tel2 | mail2 | end2
nome3 | tel3 | mail3 | end3


Obs: O script despresa a primeira linha da planilha (onde estão o nome das colunas)

Espero ter ajudado.

Abraço a tds!

Att
Junior

#6 dudesign

dudesign

    Turista

  • Usuários
  • 31 posts
  • Sexo:Masculino
  • Localidade:Estado de São Paulo

Posted 23/06/2010, 09:13

Olá Cassapava,
Seu código funciona normal, mas não teria como implantar o sistema de upload.

E teria como importar o XLS e o XLS(x)?
Dudesigner

MSN:
eduardobarrosvilla@hotmail.com

#7 Vanfer

Vanfer

    Turista

  • Usuários
  • 41 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 11/11/2010, 12:16

utilize este formato:

<style>body{font-family:Verdana, Arial, Helvetica, sans-serif}
span {font-size:11px;}
</style>
<body>
<?php 

$host="localhost";
$usuario="root";
$senha="123";
$banco="banco_dados";

$row = 1;
$handle = fopen ("arquivo.csv","r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $num = count ($data);
    echo "<p> $num campos na linha $row: <br /></p>";
    $row++;
   $sql = "Insert into tb_tabela (campo1,campo2,campo3,campo4) values ('";
    for ($c=0; $c < $num; $c++) {
       $exp1 = str_replace(chr(13),"')*****'",str_replace(";","','",$data[$c]));
	   $sql .= str_replace("*****",", (",$exp1);
	   $sql.="');";
	   $conn = mysql_connect($host, $usuario, $senha) or die("erro na conexao: ".mysql_error());
        $select = mysql_select_db($banco) or die("erro no banco: ".mysql_error());

    // run the queries individually
 

    }
}
echo '<span>Query executada: '.$sql.'</span>';
$exec=mysql_query($sql, $conn) or die(mysql_error());
if($exec==true)
echo '<H3>OS DADOS DO EXCEL FORAM INSERIDOS COM SUCESSO!</H3>';
fclose ($handle);
?>
</body>




Boa tarde pessoal!

Tenho pesquisado na internet uma maneira para importar dados de uma tabela excel para o banco (mysql), então achei várias soluções. Uma delas consiste em transformar os arquivos .xls em .csv então com um script em php enviá-los ao mysql.

O problema é que nos scripts que eu tenho os dados sempre são importados com um algarismo especial junto, aquele algarismo de parágrafo.. eh como se eu inserisse um dado e junto fosse um parágrafo, então no banco ele insere um caracter especial.
Já abri o código e tentei modificar mas o caracter especial sempre fica lá.

Já consegui efetuar essa tarefa com sucesso de outras maneiras, mas estas não atendem minhas necessidades, ou dá problema com o id que não pode ser auto incremento e tem q ser varchar ou então eu tenho q criar o sql fazendo o dump e criando um if para verificar se a tabela existe, apaga-la e recria-la

A tabela tem q ser criada somente uma vez, e então o script php deve ler e inserir os dados que estão nas linhas do arquivo .csv ou .xls

Vou postar um dos scripts que eu tenho aqui.. esse é o mais simples..

$host = "localhost";
$user = "root";
$pass = "senha";
$banco = "nome_banco";

$con = mysql_connect($host, $user, $pass);
mysql_select_db($banco, $con);

 $handle = fopen("arquivo.csv", "r");

if ($handle) { 
 $array = explode("\n", fread($handle, filesize("arquivo.csv"))); 
}  $total_array = count($array);

$i = 0;

while($i < $total_array) {

$data = explode(",", $array[$i]);


$sql = "SELECT * FROM `tabela` WHERE campo='" . $data[0] . "' LIMIT 1";

$result = mysql_query($sql);

if(mysql_num_rows($result) == 0) {

$valor = $data[0];

mysql_query("insert into tabela values (null, '$valor')");


}

$i++;
}

Se alguém puder ajudar-me ou indicar um tutorial p mim ver..

Desde já grato pela atenção!

Att
Junior


Também tem outra forma, até melhor:

<?php
echo '<style>body{font-family:Verdana, Arial, Helvetica, sans-serif}
span {font-size:11px;}
</style>
<body>';

$fileName = $_GET['arquivo'];

$host="localhost";

$usuario="username";
$senha="password";
$banco="nome_banco_dados";


$conexao = mysql_connect($host, $usuario, $senha) or die("erro na conexao: ".mysql_error());
$selecao = mysql_select_db($banco) or die("erro no banco: ".mysql_error());

if($fileName){
echo '<h4>Começando a Execução...</h4>';
$x=0;
//open file read only
$file=fopen($fileName.".csv","r");
while (!feof($file))
{
  $row=fgetcsv($file,0); //explode can be used instead
    $x++;
  echo "<span>Query Nº $x<br>";


  if($row[0]!='')
  $sqlx = "INSERT INTO tb_convidados (campo1, campo2, campo3) VALUES ('".str_replace(";","','",$row[0])."')";
  echo $sqlx."</span><br>";

 $go=mysql_query($sqlx) or die("Insert error: ".mysql_error());
}
//close file
fclose($file);
if($go==true)
echo '<h2>'.$x.' Registros incluídos com sucesso!</h2>';

}
else
{
?>
<?php
if(!$_FILES){
echo 'Selecione o Arquivo (Máximo: 10MB)';	
}
else if($_FILES['file']['size'] > 10485760){
echo 'Arquivo deve ter no máximo 10MB';	
}
else{
	$file_name = $_FILES['file']['name'];
	$file_type = $_FILES['file']['type'];
	$file_size = $_FILES['file']['size'];
	$file_tmp_name = $_FILES['file']['tmp_name'];
	$error = $_FILES['file']['error'];
	$nome_arquivo = $_FILES['file']['name'];
	$file_ext = preg_split("/\./",$file_name);
$nome_arquivo = "importado.".end($file_ext);

 $extensoes_permitidas = array('CSV', 'csv',);
	 // $extensoes4 = array('docx', 'jpge');

	  $ext=substr($nome_arquivo, -3, 3);
	//  $ext_4=substr($arq, -4, 4);
	  
	  if (in_array($ext, $extensoes_permitidas)){
      move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $nome_arquivo);}
      header('Location:'.$_SERVER['PHP_SELF'].'?arquivo=importado');

}//se existir arquivo
?>
<br /><h1>Upload do CSV</h1>
<form class="upload" name="up_arquivo" method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" >
<fieldset >
	<label>Arquivo:</label>
	<input type="file" name="file"/><br>

	<input type="submit" name="go" value="ENVIAR AGORA &gt;&gt;" />
</fieldset>
</form>
<?php
}
echo '</body>';
?>

Boa tarde pessoal!

Tenho pesquisado na internet uma maneira para importar dados de uma tabela excel para o banco (mysql), então achei várias soluções. Uma delas consiste em transformar os arquivos .xls em .csv então com um script em php enviá-los ao mysql.

O problema é que nos scripts que eu tenho os dados sempre são importados com um algarismo especial junto, aquele algarismo de parágrafo.. eh como se eu inserisse um dado e junto fosse um parágrafo, então no banco ele insere um caracter especial.
Já abri o código e tentei modificar mas o caracter especial sempre fica lá.

Já consegui efetuar essa tarefa com sucesso de outras maneiras, mas estas não atendem minhas necessidades, ou dá problema com o id que não pode ser auto incremento e tem q ser varchar ou então eu tenho q criar o sql fazendo o dump e criando um if para verificar se a tabela existe, apaga-la e recria-la

A tabela tem q ser criada somente uma vez, e então o script php deve ler e inserir os dados que estão nas linhas do arquivo .csv ou .xls

Vou postar um dos scripts que eu tenho aqui.. esse é o mais simples..

$host = "localhost";
$user = "root";
$pass = "senha";
$banco = "nome_banco";

$con = mysql_connect($host, $user, $pass);
mysql_select_db($banco, $con);

 $handle = fopen("arquivo.csv", "r");

if ($handle) { 
 $array = explode("\n", fread($handle, filesize("arquivo.csv"))); 
}  $total_array = count($array);

$i = 0;

while($i < $total_array) {

$data = explode(",", $array[$i]);


$sql = "SELECT * FROM `tabela` WHERE campo='" . $data[0] . "' LIMIT 1";

$result = mysql_query($sql);

if(mysql_num_rows($result) == 0) {

$valor = $data[0];

mysql_query("insert into tabela values (null, '$valor')");


}

$i++;
}

Se alguém puder ajudar-me ou indicar um tutorial p mim ver..

Desde já grato pela atenção!

Att
Junior






1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq