Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) função para ler dois arquivos e criar um terceiro


Dioniton

Pergunta

Olá,

Estou tentando criar um script que vai ler o arquivo arq1.txt e logo em seguida procure o que foi lido no arquivo arq2.txt. Detalhe quando não encontrar a linha lida no arq1.txt em qualquer linha do arq2.txt o script grava a informação no arquivo arq3.txt.

A seguir o script no qual estou tentando realizar as ações acima, mas não estou tendo sucesso.

OBS.:por favor se algém puder me ajuder ficarei grato. Pode ser até um outro script que vocês em outrora já tenham desenvolvido, post ele neste tópico que tentarei adaptar a minha necessidade.

Att.

Dioniton

<?

// inicia a funcao ler arq2.txt
function lerarq2 ($valor2) {
         $fp2 = fopen ("./arq2.txt", "r");

         while ($lerarq2 = fscanf ($fp2, "%d")) {
          list ( $codigo2 ) = $lerarq2;
               if ($codigo2 != $valor2) {
                $var_grava_cod = $valor2;
                 } else {
                $var_grava_cod = 0;

                }

            } // fecha o while da funcao
            grava_cod($var_grava_cod);


            fclose($fp2);
} // termina a função lerarq2

function grava_cod ($valor3) {
         $filename = 'arq3.txt';


         if ( $valor3 != 0) { // verifica se a variável veio com algum valor se não é nula executa o procedimento a seguir

             $cod_gravar = $valor3;
              // Tendo certeza que o arquivo existe e que há permissão de escrita primeiro.
              if (is_writable($filename)) {

              // abrindo $filename em modo de append (acréscimo).
              // O ponteiro do arquivo estará no final dele desde
              // que será aqui que $cod_gravar será escrito com fwrite().
              if (!$fp3 = fopen($filename, 'a')) {
              print "Erro abrindo arquivo ($filename)";
              exit;
              }

              // Escrevendo $cod_gravar para o arquivo aberto.
               if (!fwrite($fp3, $cod_gravar)) {
                   print "Erro escrevendo no arquivo ($filename)";
                        exit;
                         }

                         print "Sucesso: escrito ($cod_gravar) no arquivo ($filename) <br>";
                         fclose($fp3);

                         } else {
                         print "O arquivo $filename não pode ser editado";
                         }
            } else {

            }

} // fecha a funcao grava_cod



// vai ler o arq1.txt e a cada loop chama a função lerarq2

$fp = fopen ("./arq1.txt", "r");

while ($lerarq = fscanf ($fp, "%d")) {
       list ( $codigo ) = $lerarq;
       lerarq2($codigo);
} // fecha while
fclose($fp);



?>

Editado por Jonathan Queiroz
Desmarcar tópico como Resolvido (Jonathan)
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Hey amigo, tenta assim:

// Abrindo os arquivos arq1.txt e arq2.txt
$arq1 = fopen( "arq1.txt" , "r" );
$arq2 = fopen( "arq2.txt" , "r" );

// Declaramos as variáveis que vamos usar
$arq1_arr = array();
$arq2_content = "";

// Lemos o arq1.txt
while ( ( $line = fgets( $arq1 ) ) ){
    $line = preg_replace( "/(\\r\\n|\\r|\\n)/" , "" , $line );

    if ( !in_array( $line , $arq1_arr ) )
        $arq1_arr[] = $line;
}

// Lemos o arq2.txt
while ( ( $line = fgets( $arq2 ) ) ){
    $arq2_content .= sprintf( "|%s|" , preg_replace( "/(\\r\\n|\\r|\\n)/" , "" , $line ) );
}


// Comparamos as diferenças
$mtc = array();

if ( preg_match_all( sprintf( "/\\|(%s)\\|/" , implode( "|" , $arq1_arr ) ) , $arq2_content , $mtc ) ){
    $diff = array_diff( $arq1_arr , $mtc[ 1 ] );
    
    // Existem itens no arq1.txt que não estão no arq2.txt então vamos gravá-las no arq3.txt
    if ( count( $diff ) ){
        $arq3 = fopen( "arq3.txt" , "w+" );
        $arq3_content = implode( "\r\n" , $diff );

        fwrite( $arq3 , $arq3_content , strlen( $arq3_content ) );
        fclose( $arq3 );
    }
}

// Fechando os arquivos
fclose( $arq2 );
fclose( $arq1 );

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

  • 0

Estou precisando reabrir este tópico pois estou tendo problemas com o script!

No começo o script funcionou beleza, mas a medida que acrescentei mais informações ao arq1.txt começou apresentar o seguinte erro do apache:

fatal error: maximum execution time of 30 secounds exceeded

Bom resolvi este problema acrescentando a primeira linha do script a seguinte informação ini_set('max_execution_time','600');.

Só que agora comecei a ter um novo problema que está deixando meus cabelos brancos pois não consigo resolver. Agora aparece o seguinte erro: Warning: Compilation failed: regular expression too large at offset() in servidor/ler.php on line 31

Link para o comentário
Compartilhar em outros sites

  • 0
Estou precisando reabrir este tópico pois estou tendo problemas com o script!

No começo o script funcionou beleza, mas a medida que acrescentei mais informações ao arq1.txt começou apresentar o seguinte erro do apache:

fatal error: maximum execution time of 30 secounds exceeded

Bom resolvi este problema acrescentando a primeira linha do script a seguinte informação ini_set('max_execution_time','600');.

Só que agora comecei a ter um novo problema que está deixando meus cabelos brancos pois não consigo resolver. Agora aparece o seguinte erro: Warning: Compilation failed: regular expression too large at offset() in servidor/ler.php on line 31

hehehe, falha minha...

Bom o que está acontecendo é que eu não imaginei que arq1 e arq2 pudessem ficar tão grandes....

Se você utilizar uma @ na frente do preg_match você eliminará o Warning que está sendo gerado atualmente, porém você terá uma execução realmente MUITO lenta conforme o número de linhas começar a crescer.

Talvez se mudarmos o ponto de vista em relação ao preg_match consigamos um resultado menos danoso:

// Abrindo e lendo o arquivo arq1.txt
$arq1        = fopen( "arq1.txt" , "r" );
$arq1str    = "";
$arq1arr    = array();

while ( ( $line = fgets( $arq1 ) ) ){
    $arq1str .= $line;
}

// Abrindo e lendo o arquivo arq2.txt
$arq2        = fopen( "arq2.txt" , "r" );
$arq2str    = "";
$arq2arr    = array();

while ( ( $line = fgets( $arq2 ) ) ){
    $arq2str .= $line;
}

$arq1bool = preg_match_all( "/^.*$/m" , $arq1str , $arq1arr );
$arq2bool = preg_match_all( "/^.*$/m" , $arq2str , $arq2arr );

// Verificamos se o arq1.txt tem alguma linha
if ( $arq1bool ) {
    $diff = array();
    
    // Verificamos se encontramos alguma linha no arq2.txt, se não encontrarmos então a diferença é o próprio arq1.txt
    if ( $arq2bool ) {
        // Comparando as diferenças
        $diff = array_diff( $arq1arr[ 0 ] , $arq2arr[ 0 ] );
    } else {
        $diff = $arq1arr[ 0 ];
    }
    
    // Verificando se existem itens no arq1.txt que não estão no arq2.txt
    if ( count( $diff ) ) {
        // Existem itens no arq1.txt que não estão no arq2.txt então vamos gravá-las no arq3.txt
        $arq3 = fopen( "arq3.txt" , "w+" );
        $arq3_content = implode( "\r\n" , $diff );
        
        // Fechando o arq3.txt
        fwrite( $arq3 , $arq3_content , strlen( $arq3_content ) );
        fclose( $arq3 );
    }
}

// Fechando os arquivos
fclose( $arq2 );
fclose( $arq1 );

Tenta ai e me da um toque...

[]'s

J. Neto

Editado por neto.joaobatista
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...