importar registros de uma planilha excell

O erro ocorre quando os dados supostamente estão sendo inseridos no banco de dados. São 27000 registros quando chega em 20000 ± ele dá o erro me parece também que o tempo é longo demais então o Mysql fecha a conexão, não sei se isso existe.

Ao analisar melhor percebi que ele vai até a última linha do arquivo csv. E dá o erro.

Olha, essas coisas a gente testa assim:

  1. Quando se cria um arquivo de importação o seu código tem que ter a codificação de acordo com o layout a ser importado;
  2. É importante que primeiro, teste com 10 registros, esse negócio de 27 mil é pra quando você tiver 100% certeza que esta importando com os 10 ou 100 registros;
  3. Se o passo 1 tiver ok, ou seja, se ele importar os primeiros 10 ou 100 registros, ai o próximo passo é verificar se nos dados (nos campos de cada célula do .csv) tem algum tipo de assentos gráficos como ( ', ", ü ) não assentos como ( ~, ^, ´ ) esses passam.
  4. Seria interessante você antes de fazer os insert’s criar um mecanismo de tratamento;
    4.1) Modelo de importação com tratamento:

[code]
sc_exec_sql(“TRUNCATE consciliacao_servidores”);

$arq = $this->Ini->path_doc."/".{arquivo};

$f = fopen($arq, ‘r’);
if ($f) {

// Ler cabecalho do arquivo
$cabecalho = fgetcsv($f, 0, ";");


// Enquanto nao terminar o arquivo
while (!feof($f)) { 
	 	
    // Ler uma linha do arquivo
    $linha = fgetcsv($f, 0, ";");
    if (!$linha) {
        continue;
		
    }

    // Montar registro com valores indexados pelo cabecalho
    $registro = array_combine($cabecalho, $linha);

    // Obtendo o nome
	$nom 			= $registro['NOME'];
	$nome			= rtrim($nom);
	$cpf_serv		= $registro['CPF'];
	$cpf			= str_pad($cpf_serv, 11, "0", STR_PAD_LEFT);
	$nat 			= $registro['NAT'];
    $estado_civil   = $registro['ESTADO CIVIL'];	
	$identidade 	= $registro['IDENTIDADE'];
	$sexo 			= $registro['SEXO'];
	$ende  			= $registro['ENDERECO'];
	$ender          = rtrim($ende);
	$num			= $registro['NRO'];
	$numero			= rtrim($num);
	$endereco 		= $ender.' - '.$numero;
	$cep 			= $registro['CEP'];
	$uf 			= $registro['UF'];
	$bairro 		= $registro['BAIRRO'];
	$complemento 	= $registro['COMPLEMENTO'];
	$cidade			= $registro['MUNICIPIO'];
	$telefone 		= $registro['TEL'];
	//explode pra tratamento da data nascimento
	$nasc		 	= $registro['DATANASC']; 
	$ex 			= explode("/",$nasc); 
		
	if (count($ex) == 3) {
			$nascimento = $ex[2].'-'.$ex[1].'-'.$ex[0];
		}else{
			$nascimento = '0000-00-00';
	}
	// ------- FIM ------------------------------
	$setor 			= $registro['SETOR'];
	$escolaridade 	= $registro['ESCOLARIDADE'];
	$email 			= $registro['EMAIL'];
	
	//explode pra tratamento da data de admissao
	$data_adm		= $registro['DATA_ADM']; 
	$e 				= explode("/",$data_adm); 
	
	if(count($e)==3){
		   $data_bd = $e[2].'-'.$e[1].'-'.$e[0];
	}else{
		   $data_bd = '0000-00-00';
	}
	//--------------FIM---------------------------
	
	$cargo			= $registro['CARGO'];
	
	//TRATAMENTO PARA O CAMPO VINCULO / SITUACAO
	$vinc		= $registro['VINCULO'];

	switch(trim($vinc)){
		
		case "ATIVO PERMANENTE":
		$vinculo = '1';
		break;
		
		case "APOSENTADO":
		$vinculo = '2';
		break;
		
		case "INSTITUIDOR DE PENSAO":
		$vinculo = '3';
		break;
		
		case "CEDIDO":
		$vinculo = '4';
		break;	
		
		case "PDV":
		$vinculo = '5';
		break;
		
		default:
		$vinculo = 'teste';
		
	}
	//-------FIM -----------------------------------
	//TRATAMENTO PARA O CAMPO STATUS
	$stat			= $registro['STATUS'];
	if($stat == 'Sim'){
		$status = '1';
	}else{
		$status = '2';
	}
	//----------FIM--------------------------------
	
	$siape			= $registro['SIAPE'];
	
	
	$sql = "SELECT cpf_cnpj FROM servidores WHERE cpf_cnpj = '$cpf'";
	$exe_sql=mysql_query($sql) or die (mysql_error());
	
	$result = "";
	while($query = mysql_fetch_array($exe_sql)){
		
		$result = $query['cpf_cnpj'];
		
	}
	
		
	if($cpf != $result){			
	
	sc_exec_sql("INSERT INTO consciliacao_servidores (nome,cpf_cnpj,rg,naturalidade,estado_civil,sexo,cep,endereco,bairro,complemento,cidade,uf,telefone,nascimento,divisao_setor,escolaridade,email,data_admissao,cargo,vinculo,status_servidor,siape) VALUES ('$nome','$cpf','$identidade','$nat','$estado_civil','$sexo','$cep','$endereco','$bairro','$complemento','$cidade','$uf','$telefone','$nascimento','$setor','$escolaridade','$email','$data_bd','$cargo','$vinculo','$status','$siape')");
		
	}
			
}
fclose($f);

sc_redir(container_importacao.php, "_parent");

}[/code]

A dica é que comece o seu código pequeno, vá por partes, não queira importar tudo sem testar o máximo de imprevistos que possa ocorrer! E o mais importante é que entenda cada linha de código do arquivo e comente cada função para quando necessitar você entender rápido e desenvolver outro.

Celso,

Pode ser que o loop esteja indo além do último registro do arquivo CSV. Dá uma olhada nesse loop pra ver se ele varre somente a quantidade correta ou se vai mais além. Pode ser por aí o problema.

Bom após utilizar a técnica do Fred e analisar mais a fundo meu arquivo CSV que estava com a algumas datas e branco e rever a tabela no que se refere o charset após isso passou a funcionar 100%. Não precisei usar o utf8_decode.
Obrigado a todos pelas respostas que sempre não ajudam.

Vou encarar isso como um erro de digitação hehehehe…

kkkkkkkkkkkkkk verdade Fred!

Keyber,

segui o tutorial informado:
mais ao importar ocorre um erro:

pg_query(): Query failed: ERRO: coluna “Nilo;Nilo;chacaradas;porto;RS;94070060;5133274455;5133274456;ff” não existeLINE 1: SELECT * FROM tab_lojas WHERE nome_loj = "Nilo;Nilo;chacara… ^
Erro durante acesso ao TAB_LOJAS.
Não há registros a atualizar, verifique

o meu csv, esta assim:

nome_loj endereco bairro cidade uf_loja cep fone fax email gerente dat_inicial situacao dat_inativa codempresa
Nilo Nilo chacaradas porto RS 94070060 5133274455 5133274456 fff@terra.com 1 0000-00-00 00:00:00 0 0000-00-00 00:00:00 1

Danilo,

Qual separador está sendo usado no teu CSV? No exemplo que passei o separador dos campos é o ;.

Prezados, boa tarde.

Voltando ao assunto da importação de arquivo csv, tenho os dados da tabela abaixo e não estou conseguindo importar.

Se puderem me ajudar agradeço.

Coluna Tipo Comentário
status varchar(10) NULL
bloqueio varchar(10) NULL
dr int(2) NULL
tipo_voucher varchar(3) NULL
voucher int(10) Incremento Automático
data_Nnf_digitalizacao date NULL
lote int(12) NULL
data_lote date NULL
an8 int(12) NULL
arquivo int(3) NULL
nota varchar(25) NULL
data_emissao date NULL
valor_bruto decimal(10,2) NULL
data_vencto date NULL

Boa tarde,

Podes nos dar maiores detalhes? Como está a estrutura do teu arquivo CSV? Qual erro está aparecendo? Como está a tua rotina de importação?

Boa tarde.

Eu criei um módulo que importa um arquivo de outro programa para fazer um controle, esse arquivo é em extensão .csv (segue um anexo), preciso somente carregar o banco de dados para depois trabalhar esses lançamentos via grid gerando relatórios.

"Não MG PP 15807 26/07/2016 15:15:00 30296808 11/11/2015 3049239 03-74-00480/15 11/11/2015 624,30 11/11/2015 "
"Não BSB PP 7794 14/03/2017 14:39:00 32656132 04/01/2016 3528334 SAN 01 RONE COLINAS 04/01/2016 300,00 04/01/2016 "

E qual o caracter delimitador dos campos em CSV?

separado por vírgula.
Sou estudante iniciante.
Montei o script que você apresentou no começo do tópico mas não tenho muito conhecimento de banco de dados.

// Pegando o arquivo com caminho
$caminho = $this->Ini->path_doc;
$arq = $caminho.’/’.{arquivo};

// Processando a leitura
$fp = fopen($arq,‘r’);

// Pegando a primeira linha (cabeçalho)
$linha = fgets($fp);

// Pegando o caracter separador na coluna 14
$caracter = substr($linha,14,1);

// Processando arquivo
while ($dados = fgetcsv($fp, filesize($arq), $caracter))
$tabela[] = $dados;

fclose($fp);

$insert_sql = ‘INSERT INTO relatoriodiario (’
.‘status,bloqueio,dr,tipo_voucher,data_nf_digitalizacao,’
.‘lote,data_lote,an8,arquivo,nota,data_emissao,valor_bruto,data_vencto) VALUES’;

foreach ($tabela as $campo)
{
if (empty($campo[1])) {
break;
}
$check_sql = ‘SELECT * FROM relatoriodiario ’
. ’ WHERE id = ‘.$id.’’;
sc_select(dataset, $check_sql);
if (false == {dataset}) // Error while accessing database
{
sc_error_message(‘Erro durante acesso ao Relatório Diário.’);
}
elseif (!{dataset}->EOF) // Existe na tabela
{
continue;
}
elseif ({dataset}->EOF) // Não existe na tabela
{
$status = ‘’;
$bloqueio = ‘’;
$dr = ‘’;
$tipo_voucher = ‘’;
$voucher = ‘’;
$data_nf_digitalizacao = ‘00-00-0000’;
$lote = ‘’;
$data_lote = ‘00-00-0000’;
$an8 = ‘’;
$arquivo = ‘’;
$nota = ‘’;
$data_emissao = ‘00-00-0000’;
$valor_bruto = ‘’;
$data_vencto = ‘00-00-0000’;

    // Monta a parte de inserção dos campos
 $insert_sql2 = " ('".$status."','".$bloqueio."','".$dr."','".$tipo_voucher."','".$voucher."','".$data_nf_digitalizacao."',";
 $insert_sql2 .= "'".$lote."','".$data_lote."','".$an8."','".$arquivo."','".$nota."',".$data_emissao.",";
 $insert_sql2 .= "'".$valor_bruto."',".$data_vencto."),";
 $insert_sql .= $insert_sql2;

}
}
if (empty($insert_sql2)) {
sc_error_message(“Não há registros a atualizar, verifique”);
}
else {
// Tira o último caractere (vírgula extra)
$insert_sql = substr($insert_sql, 0, -1);

// Inserir registros
sc_exec_sql($insert_sql);

// Pega o número de registros inseridos
$cadastrados = mysql_affected_rows();
sc_error_message("Relatório Diário: " . $cadastrados);
}

Veja se o caracter separador (a virgula no teu caso) está mesmo na posição 14, como definiste aqui:

// Pegando o caracter separador na coluna 14
$caracter = substr($linha,14,1);

Ou coloque diretamente a virgula nessa variável:

// Pegando o caracter separador
$caracter = ‘,’;

Bom dia.

Solicito auxilio, aonde estou errando?

Veja o erro.

Atenção
Undefined variable: arquivo
fopen(E:/scriptcase/wwwroot/scriptcase/file/doc/): failed to open stream: No such file or directory
fgets() expects parameter 1 to be resource, boolean given
fgetcsv() expects parameter 1 to be resource, boolean given
fclose() expects parameter 1 to be resource, boolean given
Undefined variable: tabela
Invalid argument supplied for foreach()
Não há registros a atualizar, verifique

Bom dia,

Verifique se o arquivo CSV está na pasta que estás pegando aqui:

$caminho = $this->Ini->path_doc;
$arq = $caminho.’/’.{arquivo};

Pois a mensagem diz que arquivo não existe nessa pasta.

É bom dar um var_dump nessa variável $arq pra ver como esta o caminho.

Bem lembrado, Fred.

Bom dia, creio que usando a função utf8_encode ou utf8_decode no insert dará certo.