klonder 14 Denunciar post Postado Abril 24, 2012 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
Kakashi_Hatake 267 Denunciar post Postado Abril 24, 2012 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