Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

klonder

Inserir dados TXT em MySQL

Recommended Posts

Hoje mostrarei duas maneiras de se inserir linhas que estão em arquivos TXT em Bancos de Dados MySQL, utilizando para isso PHP. Resolvi criar esse tópico para ajudar pessoas que possam passar pelo mesmo problema que eu.

 

Certo dia, tive a idéia de criar um mecanismo em AJAX para buscar códigos de procedimentos do SUS (Sistema Único de Saúde) de maneira rápida, sem ter de inserir linha por linha no banco de dados. Como eu já possuía a tabela com códigos no formato PDF, bastou transferir os dados para um arquivo TXT como mostrado abaixo:

 

Arquivo: arquivo.txt

0503010014 ACOES RELACIONADAS A DOACAO DE ORGAOS TECIDOS E CELULAS 
0408010045 ARTROPLASTIA ESCAPULO-UMERAL PARCIAL 
0503010022 ACOES RELACIONADAS A DOACAO DE ORGAOS TECIDOS E CELULAS REALIZADAS POR EQUIPE DE OUTRO ESTABELECIMENTO DE SAUDE 
0408040084 ARTROPLASTIA TOTAL PRIMARIA DO QUADRIL CIMENTADA 
0301120013 ACOMPANHAMENTO DE PACIENTE C/ FENILCETONURIA 
0303130024 ATENDIMENTO A PACIENTE SOB CUIDADOS PROLONGADOS POR ENFERMIDADES CARDIOVASCULARES (POR DIA) 
0301120021 ACOMPANHAMENTO DE PACIENTE C/ FIBROSE CISTICA 
0303130032 ATENDIMENTO A PACIENTE SOB CUIDADOS PROLONGADOS POR ENFERMIDADES PNEUMOLOGICAS (POR DIA) 
0301120030 ACOMPANHAMENTO DE PACIENTE C/ HEMONOGLOBINOPATIAS 
0310010020 ATENDIMENTO AO RECEM-NASCIDO EM SALA DE PARTO 
0301120048 ACOMPANHAMENTO DE PACIENTE C/ HIPOTIREOIDISMO CONGENITO 
0502010010 AVALIACAO CLINICA DE MORTE ENCEFALICA EM MAIOR DE 2 ANOS 
0404010016 ADENOIDECTOMIA 
0502010029 AVALIACAO CLINICA DE MORTE ENCEFALICA EM MENOR DE 2 ANOS 
0306020017 AFERESE TERAPEUTICA 
0201010038 BIOPSIA CIRURGICA DE TIREOIDE 
0409070017 ALARGAMENTO DA ENTRADA VAGINAL 
0201010046 BIOPSIA DE ANUS E CANAL ANAL 
0403050014 ALCOOLIZACAO DE NERVO CRANIANO 

 

Esse arquivo possui centenas de linhas, porém mostrei algumas delas como exemplo. Vamos agora ao script PHP responsável por ler o arquivo.txt.

 

Arquivo: index.php

<?php 
//Abrindo o arquivo
$file = 'arquivo.txt';
$lines = file($file);
//Abrindo a conexão com o banco de dados
include("conexao/sphp_conexao.php");
//Lendo linha por linha do arquivo.txt
for($i = 0; $i < sizeof($lines); $i++) {

$line = $lines[$i];
//Criando uma expressão regular para compreender o padrão de cada linha do arquivo.txt
$RegExp = "/^([[:digit:]]{10})(.{1,})/";	

if (preg_match($RegExp,$line,$matches)) {
//Tentando inserir a linha atual ao banco de dados
echo "Inserindo: <b>{$matches[1]} {$matches[2]}</b><br>";
	$bd_strSQL = "INSERT INTO sus_procedimentos (bdCod, bdProcedimento) VALUES ('{$matches[1]}', '{$matches[2]}')"; 
	$bd_objRS = mysql_query($bd_strSQL,$bd_objConn) or die($bd_msg[2]."<br />Erro: ".mysql_error());

	if (mysql_affected_rows() != 0) {
		echo $i." - Inserido com sucesso!<br>";
	} else {
		echo "Nenhuma ocorrência com o termo: <b>{$matches[1]} {$matches[2]}</b> foi inserida no Banco de Dados<br>";
	}


} else {
   	echo "Erro: <br>". $line."<br>";
}
}
//Fechando a conexão com o banco de dados
mysql_close($bd_objConn);
?>

 

Observação: Os arquivos index.php e arquivo.txt deverão ficar na mesma pasta!

 

Notem que criei uma expressão regular para interpretar o formato de cada linha do arquivo.txt, porém não irei explicar sobre expressões regulares pois foge do escopo desse artigo. Você também poder recortar substrings para inserir cada item no banco de dados, funcionando da mesma maneira.

 

A estrutura do banco de dados ficaria da seguinte forma (nome da tabela ficou: sus_procedimentos):

 

#  Coluna          Tipo        Collation          Atributos  Nulo  Padrão   Extra            
1  bdId            int(10)                        UNSIGNED   Não   None     AUTO_INCREMENT  
2  bdCod           varchar(11) latin1_general_ci             Não   None
3  bdProcedimento  text        latin1_general_ci             Não   None

 

Fica aí mais essa dica, de como inserir dados em txt em bancos de dados MySQL. Espero que gostem!

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazer um insert em cada loop do FOR é uma péssima idéia :unsure:

O correto é concatenar os valores e utilizar um único insert, caso seja milhares de registros a serem inseridos, seria melhor ainda dividir em grupos de 500 registros(por exemplo) para cada insert.

 

Exemplo:

<?php

$file = file( 'arquivo.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );

array_walk( 
   $file,
   function( &$line )
   {
       $line = preg_replace( '/([\d]{10})(.+)/e', "sprintf( '( \'%1s\', \'%s\' )', trim( '$1' ), trim( '$2' ) )", $line );
   }
);

$sql = sprintf( 'INSERT INTO sus_procedimentos ( bdCod, bdProcedimento ) VALUES %s', implode( ',', $file ) );

 

Você teria uma instrução SQL assim:

INSERT INTO sus_procedimentos ( bdCod, bdProcedimento ) VALUES 
( '0503010014', 'ACOES RELACIONADAS A DOACAO DE ORGAOS TECIDOS E CELULAS' ),
( '0408010045', 'ARTROPLASTIA ESCAPULO-UMERAL PARCIAL' ),
( '0503010022', 'ACOES RELACIONADAS A DOACAO DE ORGAOS TECIDOS E CELULAS REALIZADAS POR EQUIPE DE OUTRO ESTABELECIMENTO DE SAUDE' ),
( '0408040084', 'ARTROPLASTIA TOTAL PRIMARIA DO QUADRIL CIMENTADA' ),
( '0301120013', 'ACOMPANHAMENTO DE PACIENTE C/ FENILCETONURIA' ),
( '0303130024', 'ATENDIMENTO A PACIENTE SOB CUIDADOS PROLONGADOS POR ENFERMIDADES CARDIOVASCULARES (POR DIA)' ),
( '0301120021', 'ACOMPANHAMENTO DE PACIENTE C/ FIBROSE CISTICA' ),
( '0303130032', 'ATENDIMENTO A PACIENTE SOB CUIDADOS PROLONGADOS POR ENFERMIDADES PNEUMOLOGICAS (POR DIA)' ),
( '0301120030', 'ACOMPANHAMENTO DE PACIENTE C/ HEMONOGLOBINOPATIAS' ),
( '0310010020', 'ATENDIMENTO AO RECEM-NASCIDO EM SALA DE PARTO' ),
( '0301120048', 'ACOMPANHAMENTO DE PACIENTE C/ HIPOTIREOIDISMO CONGENITO' ),
( '0502010010', 'AVALIACAO CLINICA DE MORTE ENCEFALICA EM MAIOR DE 2 ANOS' ),
( '0404010016', 'ADENOIDECTOMIA' ),
( '0502010029', 'AVALIACAO CLINICA DE MORTE ENCEFALICA EM MENOR DE 2 ANOS' ),
( '0306020017', 'AFERESE TERAPEUTICA' ),
( '0201010038', 'BIOPSIA CIRURGICA DE TIREOIDE' ),
( '0409070017', 'ALARGAMENTO DA ENTRADA VAGINAL' ),
( '0201010046', 'BIOPSIA DE ANUS E CANAL ANAL' ),
( '0403050014', 'ALCOOLIZACAO DE NERVO CRANIANO' )

 

Agora basta passar essa variável $sql para a função mysql_query e correr para o abraço :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.