Ir para conteúdo
Fórum Script Brasil
  • 0

Importar arquivos CSV e salvar no banco MySql


Marco Antonio Firmino

Pergunta

Meu arquivo CSV contem 26000 linhas e ao importar o arquivo para o banco, ele grava apenas 326 linhas e não retorna erro. 

<?php

ini_set('max_execution_time', 0);


 

    include("conn.php");

 

    $arquivo = $_FILES["file"]["tmp_name"];

    $nome    = $_FILES["file"]["name"];

 

    $ext = explode(".", $nome);

 

    $extensao = end($ext);

 

   

 

    if($extensao != "csv"){

        echo "Extensão inválida";

    }else{

 

        $objeto = fopen($arquivo, 'r');

        while(($dados = fgetcsv($objeto, 1000, ";")) !== FALSE){

            $competencia      = utf8_encode($dados[0]);

            $regional         = utf8_encode($dados[1]);

            $base_operacional = utf8_encode($dados[2]);

            $unidade_negocios = utf8_encode($dados[3]);

            $negocio          = utf8_encode($dados[4]);

            $titulo           = utf8_encode($dados[5]);

            $empresa          = utf8_encode($dados[6]);

            $nome_abrev       = utf8_encode($dados[7]);

            $vl_contabiliza   = utf8_encode($dados[8]);

            $resultado        = utf8_encode($dados[9]);

            $obs              = utf8_encode($dados[10]);

 

            $result = $conn->query("INSERT INTO  pcld_acum

            (competencia,regional,base_operacional,unidade_negocios,negocio,titulo,empresa,nome_abrev,vl_contabiliza,resultado,obs)

            VALUES

            ('$competencia','$regional','$base_operacional','$unidade_negocios','$negocio','$titulo','$empresa','$nome_abrev',$vl_contabiliza,'$resultado','$obs')");

        }

           if($result){

               echo "Dados inseridos com sucesso!";

           }else{

                echo "Erro ao inserir os dados!";

           }

    }

 

?>

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá!
É bem difícil adivinhar o que aconteceu sem poder reproduzir o script.
Certa vez escrevi um que funcionou muito bem.
Tente adaptá-lo e veja se funciona pra você tb:
 

<?php
// carrega o arquivo.csv ignorando quebras de linha no final da linha e linhas vazias
$file = file('seu-arquivo.csv', FILE_TEXT | FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// o caracter delimitador
$delimitier = ';';

// caso a primeira linha seja o cabeçalho (essa linha será removida da variável $file)
$header = array_shift($file);

// verifica se o delimitador existe
if (!strpos($header, $delimitier)) {
  die('O delimitador: ( <b>' . $delimitier . '</b> ), não foi encontrado!');
}

// separa cada elemento do cabeçalho
$header = explode($delimitier, $header);

// inicia a variável para guardar os erros(se houver algum)
$errors = [];

// para cada linha em $file
foreach ($file as $i => $line) {

  $arrayLine = explode($delimitier, $line);

  // verifica se a quantidade de colunas é igual às do header
  if (sizeof($arrayLine) != sizeof($header)) {
    $errors[] = 'A linha: <b>' . ($i + 2) . 'não tem o mesmo número de colunas!';
    continue;
  }

  // tratar os dados
  foreach ($arrayLine as $index => $value) {
    // se o valor estiver entre aspas simples, serão removidas
    $value = trim($value, "'");
    // se for numérico
    if (preg_match('/^[0-9.,]+$/', $value)) {
      // não precisa tratar o valor
      $arrayLine[$index] = $value;
    } else {
      // se não for numérico, o valor será tratato com utf-8, terá caracteres escapados e será colocado entre aspas simples
      $arrayLine[$index] = "'" . addslashes(utf8_encode($value)) . "'";
    }
  }
  // coloca cada linha entre parenthesis
  $file[$i] = '(' . implode(', ', $arrayLine) . ')';
}

// se houver erros
if (sizeof($errors)) {
  foreach ($errors as $error) {
    // mostra cada erro encontrado na tela
    echo '<p>' . $error . '</p>';
  }
}
// considera o cabeçalho como sendo iguais aos nomes das colunas do database
$keys  = $header;

// quebra as linhas em grupos de 100 linhas
$inserts = array_chunk($file, 100, true);

// para cada grupo de 100 linhas
foreach ($inserts as $v) {
  // adiciona a query de inserção no array $dump
  $dump[] = "insert into $table(`" . implode('`, `', $keys) . "`) values\n   " . implode(",\n     ", $v) . "\n";
}

// para cada grupo de 100 inserções por insert em $dump
foreach ($dump as $query) {
  // mostra na tela como ficou cada query de 100 inserções por insert
  echo '<pre>$query: ';
  print_r($query);
  echo '</pre>';
	// execute a sua query de inserção no banco de dados aqui
}

Ao invés de inserir cada linha uma a uma, inserir em grupos de 100 diminui em muito a quantidade de requisições ao database, aumentando em muito o desempenho.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...