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:
- 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;
- É 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;
- 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.
- 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.