Jump to content


Photo

Importação De Txt


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

#1 EDUARDO_COSTA

EDUARDO_COSTA

    Novato no fórum

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

Posted 05/03/2010, 19:26

Boa noite pessoal, estou precisando de uma ajuda de como melhorar um script de importação. pois funciona mas demora!!!.... vamos la.


Tenho a seguinte situação

---------------------------------
ESTRUTURA DO TXT A SER IMPORTADO
---------------------------------

CAD_CLIENTEEVENTOS
4202;28/02/2010;00:00:20;E470000;E1;
^^
4202;28/02/2010;00:00:23;R400000;U1;
^^
*PRIMEIRA LINHA DO TXT (CAD_CLIENTESEVENTOS) é a identificação do txt a ser importado, se o nome for diferente disso nao processa.
*SEGUNDA LINHA DO TXT SAO OS CAMPOS A SEREM IMPORTADOS PARA O MYSQL SEPARADOS POR (;)
*TERCEIRA LINHA DO TXT ( ^^ ) SERVE PARA SEPARAR OS CADASTROS.

PHP DEVE FAZER A SEGUINTE FUNÇÃO
----------------------------------
1--> APÓS ALGUMAS VERIFICAÇÕES Q NAO VEM AO CASO NESTE MOMENTO...
2--> ANALISAR SE OS REGISTROS A SEREM IMPORTADOS JA EXISTEM NA TABELA MYSQL, CASO SIM EFETUAR SOMENTE A ATUALIZAÇÃO DE DADOS.

ESTA VERIFICAÇÃO DEVE SER TOMADA COMO BASE:

SE -> cliente + data_ocorrencia + hora_ocorrencia ( EXISTE NA TABELA MYSQL,) ENTAO PRECISA SOMENTE EFETUAR A ALTERAÇÃO DOS SEGUINTES CAMPOS SENDO ELES --> evento + resultado + contato --> (PARA cliente+data_ocorrencia+hora_ocorrencia)QUE FORAM ENCONTRADOS NO BANCO.

---------

O PROBLEMA É QUE SÃO IMPORTADOS MAIS DE 50MIL REGISTROS POR TXT, COMO FAZER PARA QUE ISSO NAO FIQUE LENTOOOO DEMAIS.

SEGUE O SCRIPT QUE FAZ A IMPORTAÇÃO.


					#########
					#	UPLOAD DO TXT PRO SERVIDOR.
					#########
					$NQS_IDENTIFICADOR = substr(uniqid(md5($_FILES["arquivo"]["tmp_name"].time())),0,9);
					$NQS = $NQS_IDENTIFICADOR."".$TIPO_DO_ARQUIVO_POSTADO; //NOME DO ARQUIVO
					$D_NQS = $_SERVER['DOCUMENT_ROOT']."/info/upload/$pastarquivo/".$NQS;
					if(move_uploaded_file($_FILES["arquivo"]["tmp_name"], $D_NQS))
					{
						//ARQUIVO UPADO, DAMOS A PERMISSAO PARA LEITURA POSTERIOR 777
						chmod ($D_NQS, 0777);
						//LOCALIZAMOS O TXT NO SERVER
						$lines = file($D_NQS);								
						//IDENTIFICAMOS O TIPO DE TXT NA IMPORTACAO DOS CADASTROS.
                                               if(substr($lines[0],0,18)=="CAD_CLIENTEEVENTOS")
						{
                                                        //ABRIMOS ARQUIVO NO SERVIDOR PARA LEITURA
							$file = fopen($D_NQS,"r");
							
							$imp=1;
							while (!feof($file))
							{
								if ($linha = fgets($file))
								{
                                                                        //IGNORAMOS AS LINHAS Q CONTENHAM "^^"
									 if ($linha != "^^")
									 { 
										$N_LINHA_ARQUIVO = fgets($file,1024); //ARMAZENA DADOS DA LINHA
								
										//SEPARAMOS OS CAMPOS PELO TAMANHO DOS CARACTERES COM SUBSTR
										$COD_CLI = substr($N_LINHA_ARQUIVO,0,4); //CODIGO DO CLIENTE 1º CAMPO DO TXT
										$DT_EVENTO_CLI = substr($N_LINHA_ARQUIVO,5,10); //DATA 2º CAMPO DO TXT
										$HR_EVENTO_CLI = substr($N_LINHA_ARQUIVO,16,8); //HORA 3º CAMPO DO TXT
										$COD_EVENTO_CLI = substr($N_LINHA_ARQUIVO,25,7); //CODIGO DO EVENTO 4ºCAMPO TXT
										$COD_RESULTADO_CLI = substr($N_LINHA_ARQUIVO,33,2); //CODIGO DO RESULTADO 5ºCAMPO DOTXT
										$CONTATO_CLI = substr($N_LINHA_ARQUIVO,36,50); //NOME DO CONTATO 6ºCAMPO DO TXT
										
										//REFORMULAMOS A NOVA DATA
										$ANO_NOVADATA_CLI = substr($DT_EVENTO_CLI,6,4);	//ANO
										$DIA_NOVADATA_CLI = substr($DT_EVENTO_CLI,0,2);	//DIA
										$MES_NOVADATA_CLI = substr($DT_EVENTO_CLI,3,2);	//MES							
										$NOVA_DATA_CLI = $ANO_NOVADATA_CLI."-".$MES_NOVADATA_CLI."-".$DIA_NOVADATA_CLI;
										
											//**AQUI COMECA O PROBLEMA CONSULTA PRA VERIFICAR SE O REGISTRO JA EXISTE NA BASE DE DADOS PARA NAO REPETIR E SIM ATUALIZAR.
											$SQL_REPETIDO = mysql_query("SELECT cliente,data_ocorrencia,hora_ocorrencia FROM $NOME_TABELA_RELATORIOS_EVENTOS WHERE cliente = '".trim($COD_CLI)."' and data_ocorrencia = '".$NOVA_DATA_CLI."' and hora_ocorrencia = '".$HR_EVENTO_CLI."'");
											
											if(mysql_num_rows($SQL_REPETIDO)==1)
											{
												$SQL_ATUALIZA_EVENTOS = mysql_query("UPDATE $NOME_TABELA_RELATORIOS_EVENTOS SET
													evento = '".trim($COD_EVENTO_CLI)."',
													resultado = '".trim($COD_RESULTADO_CLI)."',
													contato = '".trim($CONTATO_CLI)."'
												where cliente = '".trim($COD_CLI)."' and data_ocorrencia = '".$NOVA_DATA_CLI."' and hora_ocorrencia = '".trim($HR_EVENTO_CLI)."'") or print mysql_error();
												
													
											}
											else
											{
												//INSERINDO DADOS
												$SQL_CADASTRA_EVENTOS = mysql_query("INSERT $NOME_TABELA_RELATORIOS_EVENTOS
													(
														 id,
														 cliente,
														 data_ocorrencia,
														 hora_ocorrencia,
														 evento,
														 resultado,
														 contato									 
													)	
													VALUES 
													(
														'',
														'".trim($COD_CLI)."',
														'".addslashes(trim($NOVA_DATA_CLI))."',
														'".addslashes(trim($HR_EVENTO_CLI))."',
														'".addslashes(trim($COD_EVENTO_CLI))."',
														'".addslashes(trim($COD_RESULTADO_CLI))."',
														'".addslashes(trim($CONTATO_CLI))."'
													) 
												") or print mysql_error();	
												
																
											}
											
											if($SQL_CADASTRA_EVENTOS){
											
												echo alerta("ARQUIVO IMPORTADO COM SUCESSO!");
												
												//chmod ($D_NQS, 0775);
												//@unlink($D_NQS);
											}
											if($SQL_ATUALIZA_EVENTOS)
											{
												echo alerta("ARQUIVO ATUALIZADO COM SUCESSO!");
												//chmod ($D_NQS, 0775);
												//@unlink($D_NQS);
											}
										
									} 
								} 
								$imp++;
							} // WHILE	
						}
						else
						{
							echo alerta("TXT INCORRETO PARA IMPORTAR (HEADER DEVE SER --> CAD_CLIENTEEVENTOS ), VERIFIQUE");					
							//REMOVEMOS O TXT UPADO POIS ELE FOI IMCOMPATIVEL PARA IMPORTAÇÃO DOS DADOS.
							@unlink($D_NQS);
						}
					}		




SERA QUE TEM ALGUEM AI QUE POSSA ME AJUDAR NISSO..

SE POSSÍVEL COMO FAZER PARA MOSTRAR A QUANTIDADE DE DADOS QUE FORAM INSERIDOS E A QUANTIDADE QUE FORAM ATUALIZADO.. MAS ISSO É O DE MENOS O IMPORTANTE É EXECUTAR O SCRIPT DE FORMA RAPIDA.. POIS AS VEZES NEM ATUALIZA NEM INSERE NADA.. POR CAUSA DA LENTIDAO QUE GERA..

DESDE JÁ AGRADEÇO

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 05/03/2010, 20:44

Você poderia eliminar este SELECT + INSERT/UPDATE por apenas um INSERT usando ON DUPLICATE KEY UPDATE.

Você criaria uma chave única composta com os campos que você mencionou ser a regra: (cliente, data_ocorrencia, hora_ocorrencia)

Para criar esta chave pode ser algo como:

CREATE UNIQUE INDEX NOME_DO_INDEX ON NOME_DA_TABLE(cliente, data_ocorrencia, hora_ocorrencia);

E então você poderia remover o SELECT+INSERT/UPDATE e colocar apenas::

INSERT INTO $NOME_TABELA_RELATORIOS_EVENTOS
(
	 id,
	 cliente,
	 data_ocorrencia,
	 hora_ocorrencia,
	 evento,
	 resultado,
	 contato
)       
VALUES 
(
	NULL,
	'".trim($COD_CLI)."',
	'".addslashes(trim($NOVA_DATA_CLI))."',
	'".addslashes(trim($HR_EVENTO_CLI))."',
	'".addslashes(trim($COD_EVENTO_CLI))."',
	'".addslashes(trim($COD_RESULTADO_CLI))."',
	'".addslashes(trim($CONTATO_CLI))."'
)
ON DUPLICATE KEY UPDATE 
	evento    = VALUES(evento),
	resultado = VALUES(resultado),
	contato   = VALUES(contato)

Talvez ajude um pouco.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 EDUARDO_COSTA

EDUARDO_COSTA

    Novato no fórum

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

Posted 13/03/2010, 08:47

Bom dia,

galera valeu pela resposta funcionou corretamente o sistema.. desculpa a demora em responder :)




2 user(s) are reading this topic

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

IPB Skin By Virteq