Ir para conteúdo

POWERED BY:

Arquivado

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

MurielSpaler

Manipulando arquivo TXT com PHP

Recommended Posts

Boa tarde a todos,

Já procurei neste forum e pala intenet quase toda e nao achei o que preciso, por isso estou aqui pedindo

a ajuda de voces, tenho um arquivo em teste1.TXT que contem (UmTrilão de Linhas) e preciso pegar as informações

dessas linhas e adicionar no BD linha a linha, destrinchando igual o exemplo abaixo:

 

 

09/06/2012 MANOEL CIRILO DE SOUZA JOAO PESSOA-PB

 

onde preciso criar as váriaveis assim:

$data =09/06/2012; 
$nome="MANOEL CIRILO DE SOUZA";
$cidade="JOAO PESSOA";
$Lixo="-";
$Sigla="PB";

Depois que eu tiver as variaveis criadas, para incluir no BD eu sei, o problema que o scrip que eu estou usando

esta dando "pau" na hora de criar as variaves. Segue o exemplo:

<?php
$handle = @fopen("teste1.txt", "r");
if($handle)
{
       while( ! feof($handle))
       {
               $buffer = fgets($handle, 4096);

               //Separa os dados aqui
               echo 'Data          : '   . substr($buffer, 0, 10) . '<br />';
               echo 'Nome compelto : '   . substr($buffer, 10, 60) . '<br />';
               echo 'Estado        : '   . substr($buffer, 14, 10) . '<br />';
               echo 'Sigla         : '   . substr($buffer, 20, 10) . '<br />';


               /* Continua ... */



               echo '--------<br />';

       }
       fclose($handle);
}

?>

 

==============================================================

Segue um exemplo do TXT que estou usando:

09/06/2012      MANOEL CIRILO DE SOUZA  JOAO PESSOA-PB
05/06/2012	MARIA DALVA PINTO	FORTALEZA-CE
25/05/2012	MARIA HELENA DE FREITAS COSTA	FORTALEZA-CE
02/05/2012	ERNANI BARBOSA DE MOURA	FORTALEZA-CE
25/04/2012	BENEDITO GOMES DE ANDRADE	MONTES CLAROS-MG
23/04/2012	MILTON HOLANDA	FORTALEZA-CE
18/04/2012	JOSE RIBAMAR REGO	TERESINA-PI
10/04/2012	IDELSEO CARVALHO FILHO	SALVADOR-BA
05/04/2012	JOSE DO BONFIM OLIVEIRA	RECIFE-PE
31/03/2012	HILTON FERREIRA DE MORAES	SAO LUIS-MA
24/03/2012	FRANCISCO MEIRA BARBOSA	FORTALEZA-CE
21/03/2012	PERICLES EDMUNDO GUEDES DOS SANTOS	JEQUIE-BA
19/03/2012	TARCISO DE SIQUEIRA PONTES	FORTALEZA-CE
21/02/2012	ADELMAR GONÇALVES FERREIRA	NATAL-RN
15/02/2012	RAIMUNDO NONATO DE ABREU	FORTALEZA-CE
06/02/2012	CONCEIÇAO MOREIRA HENRIQUE	SURUBIM-PE
17/01/2012	ALBERICO JOSE DE MOURA SALDANHA	MACEIO-AL

===================================

Desde já agradeço a atenção

Atenciosamente

Muriel Spaler

Compartilhar este post


Link para o post
Compartilhar em outros sites

substr() não resolverá, pois há campos de tamanhos desconhecidos (nome e cidade). O ideal seria que esse arquivo tivesse um separador entre os campos. por exemplo:

 

data ; nome ; cidade

 

é possível gerar o arquivo com separadores? se sim, basta um explode() no conteúdo da linha. Se não, o bicho pegou :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

substr() não resolverá, pois há campos de tamanhos desconhecidos (nome e cidade). O ideal seria que esse arquivo tivesse um separador entre os campos. por exemplo:

 

data ; nome ; cidade

 

é possível gerar o arquivo com separadores? se sim, basta um explode() no conteúdo da linha. Se não, o bicho pegou :)

 

O arquivo dele tem separadores... tabulação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Muriel.

 

Bom, para trabalharmos com textos, precisamos isolar o seu conteúdo atômico e encontrar padrões

 

Observe que você tem os valores desejados: "data, nome, cidade e estado"

 

Tente transformar a forma como você identifica essas informações em um algoritmo que deverá ser lido pelos robôs.

 

Percebemos que tudo que estiver até o primeiro espaço será uma data. Até aqui não teremos problemas.

 

Sabemos, também, que o que estiver após o hífen é o estado.

 

Chegamos ao ponto problemático: Não há uma forma de separar o nome da cidade no registro. O separador de nome-cidade é o mesmo que compõe os nomes e também os nomes das cidades. um espaço.

 

Vamos trabalhar com o que já temos:

 

$manipulador = fopen('nomedoarquivo.txt','w');
$dados = array();
while (FALSE !== ($linha = fgets($manipulador))) {
   $l           = array('data' => NULL, 'nome' => NULL, 'cidade' => NULL, 'estado' => NULL);
   $partes      = explode(' ', $linha);
   $l['data']   = array_shift($partes);
   $estado      = array_pop($partes);
   $estado      = explode('-', $estado);
   $l['estado'] = $estado[1];
   array_push($partes, $estado[0]);

   /* Até aqui, temos a data e o estado */
}

 

A partir de agora, precisamos encontrar uma forma inteligente de separar o nome da cidade.

 

A maneira mais fácil é encontrar o nome da cidade primeiro e o que restar é o nome da pessoa.

 

Você pode verificar, da direita para a esquerda, quando as palavras formam o nome de uma cidade colidindo contra um banco conhecido.

 

Para fins de exemplo, nosso banco será um Array com três cidades. No seu caso pode ser uma tabela do banco, um outro arquivo de texto, ou qualquer otura forma.

 

$cidades = array('SAO PAULO','RIO DE JANEIRO','BRASILIA','PARANA','BELO HORIZONTE');

 

$manipulador = fopen('nomedoarquivo.txt','w');
$dados = array();
while (FALSE !== ($linha = fgets($manipulador))) {
   $l           = array('data' => NULL, 'nome' => NULL, 'cidade' => NULL, 'estado' => NULL);
   $partes      = explode(' ', $linha);
   $l['data']   = array_shift($partes);
   $estado      = array_pop($partes);
   $estado      = explode('-', $estado);
   $l['estado'] = $estado[1];
   array_push($partes, $estado[0]);

   for ($n = count($partes), $cidade = NULL; $n; $n -= 1) {
       $cidade .= array_pop($partes);
       // Esta é a linha que deverá ser adequada ao seu 'banco de cidades'
       if (in_array($cidade, $cidades)) {
           $l['cidade'] = $cidade;
           break;
       }
   }

   // o que sobrou é o nome da pessoa
   $l['nome']   = implode($partes);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

substr() não resolverá, pois há campos de tamanhos desconhecidos (nome e cidade). O ideal seria que esse arquivo tivesse um separador entre os campos. por exemplo:

 

data ; nome ; cidade

 

é possível gerar o arquivo com separadores? se sim, basta um explode() no conteúdo da linha. Se não, o bicho pegou :)

 

===============================================================================================

Estava fazendo um teste no arquivo com trilhoes de linha e cheguei a conclusao que é mais facil modificar o arquivo conforme você sugeriu,

posso também modificar as posições das informaçoes, deixando o nome no final da linha, ou nome da cidade depois da data, o que voces sugerirem para que funcione, pois preciso muito pegar essas informacoes linha a linha

transformar em variaveis e incluir em outro DB.

 

veja como ficou:

 

02/05/2012 ; ERNANI BARBOSA DE MOURA ;FORTALEZA ; CE

25/04/2012 ; BENEDITO GOMES DE ANDRADE ;MONTES CLAROS ; MG

23/04/2012 ; MILTON HOLANDA ;FORTALEZA ; CE

18/04/2012 ; JOSE RIBAMAR REGO ;TERESINA ; PI

10/04/2012 ; IDELSEO CARVALHO FILHO ;SALVADOR ; BA

05/04/2012 ; JOSE DO BONFIM OLIVEIRA ;RECIFE ; PE

31/03/2012 ; HILTON FERREIRA DE MORAES ;SAO LUIS ; MA

24/03/2012 ; FRANCISCO MEIRA BARBOSA ;FORTALEZA ; CE

 

E agora? como posso fazer para transformar essas informaçoes em variaveis.?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora ficou moleza :yay:

 

<?php

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

array_walk(
   $file,
   function( &$line )
   {
       $values = explode( ';', $line );
       array_walk( 
           $values,
           function( &$value )
           {
              $value = trim( $value );
           }
       );
       $line = array_combine(
                   array( 'data', 'nome', 'cidade', 'sigla' ),
                   $values
               );
   }
);

var_dump( $file );

 

Saída

array
 0 => 
   array
     'data' => string '02/05/2012' (length=10)
     'nome' => string 'ERNANI BARBOSA DE MOURA' (length=23)
     'cidade' => string 'FORTALEZA' (length=9)
     'sigla' => string 'CE' (length=2)
 1 => 
   array
     'data' => string '25/04/2012' (length=10)
     'nome' => string 'BENEDITO GOMES DE ANDRADE' (length=25)
     'cidade' => string 'MONTES CLAROS' (length=13)
     'sigla' => string 'MG' (length=2)
 2 => 
   array
     'data' => string '23/04/2012' (length=10)
     'nome' => string 'MILTON HOLANDA' (length=14)
     'cidade' => string 'FORTALEZA' (length=9)
     'sigla' => string 'CE' (length=2)
 3 => 
   array
     'data' => string '18/04/2012' (length=10)
     'nome' => string 'JOSE RIBAMAR REGO' (length=17)
     'cidade' => string 'TERESINA' (length=8)
     'sigla' => string 'PI' (length=2)
......

Compartilhar este post


Link para o post
Compartilhar em outros sites

MurielSpaler;

 

Boa noite amigo agora é só usar um laço de repetiçao para inserir dados no banco, pois você já conseguiu ler o arquivo, já lhe deram exemplo de como armazenar isso em um array, agora é só o laço.:

 

for:

 

for ($i=0;$i<$tamanhoArray;$i++){
    $sql = "INSERT INTO table VALUES (NULL, $data[$i],$nome[$i],$cidade[$i],$uf[$i])";
}

Mas ai tem outros como você já sabe. Isso é somente um exemplo, custumo fazer assim(dar exemplos), pois o forum fazia assim comigo, e somente hoje reconheço o que o forum fez por mim.

 

qualquer coisa posta ai, tem muita gente boa ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora ficou moleza :yay:

 

<?php

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

array_walk(
   $file,
   function( &$line )
   {
       $values = explode( ';', $line );
       array_walk( 
           $values,
           function( &$value )
           {
              $value = trim( $value );
           }
       );
       $line = array_combine(
                   array( 'data', 'nome', 'cidade', 'sigla' ),
                   $values
               );
   }
);

var_dump( $file );

 

Saída

array
 0 => 
   array
     'data' => string '02/05/2012' (length=10)
     'nome' => string 'ERNANI BARBOSA DE MOURA' (length=23)
     'cidade' => string 'FORTALEZA' (length=9)
     'sigla' => string 'CE' (length=2)
 1 => 
   array
     'data' => string '25/04/2012' (length=10)
     'nome' => string 'BENEDITO GOMES DE ANDRADE' (length=25)
     'cidade' => string 'MONTES CLAROS' (length=13)
     'sigla' => string 'MG' (length=2)
 2 => 
   array
     'data' => string '23/04/2012' (length=10)
     'nome' => string 'MILTON HOLANDA' (length=14)
     'cidade' => string 'FORTALEZA' (length=9)
     'sigla' => string 'CE' (length=2)
 3 => 
   array
     'data' => string '18/04/2012' (length=10)
     'nome' => string 'JOSE RIBAMAR REGO' (length=17)
     'cidade' => string 'TERESINA' (length=8)
     'sigla' => string 'PI' (length=2)
......

 

Caro colega, agradeço muito a sua disposição em ajudar, mas se nao for pedir muito, seria possivel facilitar o codigo, pois testei várias vezes e diversos erros ocorreram e tentei consertar, mais infelizmente com o meu conhecimento em php, nao deu certo. Entao quanto mais simples, melhor.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muriel, tente assim:

<?php

      // abre o arquivo para leitura
      $handler = fopen ( 'arquivo.txt' , 'r' ) ;
      if ( $handler !== false ) {
             $i = 0 ; // define um contador
             $dados = array ( ) ;
             // lê até o final do arquivo
             while ( ! feof ( $handler ) ) {
                    // recupera uma linha do arquivo
                    $linha = fgets ( $handler , 1024 ) ;
                    // forma um array com os dados separados por ;
                    $info = explode ( ';' , $linha ) ;
                    // preenche o array
                    $dados [ $i ] [ 'data' ] = $info [ 0 ] ;
                    $dados [ $i ] [ 'nome' ] = trim ( $info [ 1 ] ) ;
                    $dados [ $i ] [ 'cidade' ] = trim ( $info [ 2 ] ) ;
                    $dados [ $i ] [ 'estado' ] = trim ( $info [ 3 ] ) ;
                    ++ $i ; // incrementa o contador
             }
             // libera o arquivo da memória
             fclose ( $handler ) ;
             // mostra os dados do array
             print_r ( $dados ) ;
      }

 

Minha saída foi :


Array
(
   [0] => Array
       (
           [data] => 02/05/2012 
           [nome] => ERNANI BARBOSA DE MOURA
           [cidade] => FORTALEZA
           [estado] => CE
       )

   [1] => Array
       (
           [data] => 25/04/2012 
           [nome] => BENEDITO GOMES DE ANDRADE
           [cidade] => MONTES CLAROS
           [estado] => MG
       )

   [2] => Array
       (
           [data] => 23/04/2012 
           [nome] => MILTON HOLANDA
           [cidade] => FORTALEZA
           [estado] => CE
       )

   [3] => Array
       (
           [data] => 18/04/2012 
           [nome] => JOSE RIBAMAR REGO
           [cidade] => TERESINA
           [estado] => PI
       )

   [4] => Array
       (
           [data] => 10/04/2012 
           [nome] => IDELSEO CARVALHO FILHO
           [cidade] => SALVADOR
           [estado] => BA
       )

   [5] => Array
       (
           [data] => 05/04/2012 
           [nome] => JOSE DO BONFIM OLIVEIRA
           [cidade] => RECIFE
           [estado] => PE
       )

   [6] => Array
       (
           [data] => 31/03/2012 
           [nome] => HILTON FERREIRA DE MORAES
           [cidade] => SAO LUIS
           [estado] => MA
       )

   [7] => Array
       (
           [data] => 24/03/2012 
           [nome] => FRANCISCO MEIRA BARBOSA
           [cidade] => FORTALEZA
           [estado] => CE
       )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta seria outra possibilidade também:

 

$handler = fopen ( 'file.txt' , 'r' ) ;

$data = array();

if ( $handler !== false ) {

   while ( ! feof( $handler ) ) {

       $data[] = preg_split( '/\s*;\s*/', trim( fgets ( $handler, 1024 ) ) );
   }

   fclose ( $handler ) ;
}

var_dump( $data );

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Breuno Augusto :yay:

 

Ficou legal utilizando expressão regular, eu só adicionaria os índices associativos(por pura frescura mesmo).

 

$data[ ] = array_combine(
              array( 'data', 'nome', 'cidade', 'sigla' ),
              preg_split( '/\s*;\s*/', trim( fgets ( $handler, 1024 ) ) )
          );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pensei em fazer isso, mas o chefe tá urubuzando por aqui.

 

Daí na pressa eu nem coloquei u.u

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois bem pessoal, para mim continua dando erro e eu nao estou conseguindo descobrir aonde estou errando, seria bom se aparecesse para mim, da mesma forma que aparece a saida Andrey:

[1] => Array
       (
           [data] => 25/04/2012 
           [nome] => BENEDITO GOMES DE ANDRADE
           [cidade] => MONTES CLAROS
           [estado] => MG
       )

Entao minha intenção é atribuir essas informaçoes as variaveis:

 

$data = 25/04/2012;
$nome = "BENEDITO GOMES DE ANDRADE";
$cidade = "MONTES CLAROS";
$estado = "MG";

E em seguida add no banco de dados.

 

O erro que aparece para mim é esse:

Array ( [0] => Array ( [data] => [nome] => MANOEL CIRILO DE SOUZA JOAO PESSOA [cidade] => PB [estado] => ) [1] => Array ( [data] => [nome] => MARIA DALVA PINTO FORTALEZA [cidade] => CE [estado] => ) [2] => Array ( [data] => [nome] => MARIA HELENA DE FREITAS COSTA FORTALEZA [cidade] => CE [estado] => ) [3] => Array ( [data] => [nome] => JOSE CANDIDO MARQUES CAVALCANTE FORTALEZA [cidade] => CE [estado] => ) [4] => Array ( [data] => [nome] => MARCELINO NASCIMENTO VALE FORTALEZA [cidade] => CE [estado] => ) [5] => Array ( [data] => [nome] => RENAN SEPULVEDA CAVALCANTE FORTALEZA [cidade] => CE [estado] => ) [6] => Array ( [data] => [nome] => ERNANI BARBOSA DE MOURA FORTALEZA [cidade] => CE [estado] => ) [7] => Array ( [data] => [nome] => BENEDITO GOMES DE ANDRADE MONTES CLAROS [cidade] => MG [estado] => ) [8] => Array ( [data] => [nome] => MILTON HOLANDA FORTALEZA [cidade] => CE [estado] => ) [9] => Array ( [data] => [nome] => Ultimo Nome CURITIBA [cidade] => PR [estado] => ) ) 

E o arquivo que estou usando para fazer o teste contem apenas 10 linhas e segue a baixo o arquivo.

 

09/06/2012 ;    MANOEL CIRILO DE SOUZA  JOAO PESSOA ; PB
05/06/2012 ; 	MARIA DALVA PINTO	FORTALEZA ; CE
25/05/2012 ;	MARIA HELENA DE FREITAS COSTA	FORTALEZA ; CE
08/05/2012 ;	JOSE CANDIDO MARQUES CAVALCANTE	FORTALEZA ; CE
06/05/2012 ;	MARCELINO NASCIMENTO VALE	FORTALEZA ; CE
05/05/2012 ;	RENAN SEPULVEDA CAVALCANTE	FORTALEZA ; CE
02/05/2012 ;	ERNANI BARBOSA DE MOURA	FORTALEZA ; CE
25/04/2012 ;	BENEDITO GOMES DE ANDRADE	MONTES CLAROS ; MG
23/04/2012 ;	MILTON HOLANDA	FORTALEZA ; CE
23/04/2012 ;	Ultimo Nome	CURITIBA ; PR

Pessoal, me ajudando com isso, ficarei eternamente grato... :-)

Agoardo... Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falta um ponto-e-vírgula entre o nome do cidadão e a cidade. Sem esse ponto-e-vírgula, voltamos à estaca zero. Você pode separar com ponto-e-vírgula, dois-pontos, coraçõezinhos, ursos-pandas-saltitantes, que nada vai te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente, Evandro.

 

E infelizmente dada a má formação da estrutura de tabulações é quase impossível de elaborar um padrão que corrija automaticamente porque, desconsiderando-se da deficiência do ponto-e-vírgula, o formato seria:

 

TEXTO<TAB>TEXTO<TAB>TEXTO<TAB>TEXTO<FIM DA LINHA>

Porém, a exemplo do primeiro registro, não existe um <TAB> entre SOUZA e JOAO PESSOA.

 

Dessa forma, pra mim, o máximo a se fazer seria alertar qual(is) linha(s) está(ão) mal formadas e você, então, consertaria manualmente:

 

<?php

$handler = fopen ( 'file.txt' , 'r' ) ;

$data = array();

if ( $handler !== false ) {

   while ( ! feof( $handler ) ) {

       $line = trim( fgets ( $handler, 1024 ) );

       // Removing all spaces

       $line = preg_replace( '/\s*;\s*/', "\t", $line );

       if( substr_count( $line, "\t" ) < 3 ) {

           printf(

               'Falha na estrutura detectada.

               <br /><br />

               Ajuste o número de tabulações na linha referente a %s',

               $line
           );

           continue;
       }

       $data[] = array_combine(

           array( 'date', 'name', 'city', 'state' ),

           explode( "\t", $line )
       );
   }

   fclose ( $handler ) ;
}

var_dump( $data );

Fiz uma limpeza, removendo esses pontos-e-vírgulas para tornar o procedimento mais eficiente, já que, agora, haverá um cálculo adicional dentro do loop.

 

Rodando com o último conteúdo do arquivo postado, logo a primeira linha retornará o aviso e será ignorada. O restante, se estiver dentro do esperado, será separado com sucesso.

 

Destaque para a necessidade de ser ignorada devido ao uso de array_combine() conforme o Carlos Coelho havia postado que exige que ambos os arrays tenham o mesmo comprimento, evitando-se, assim, que o script páre.

 

Sem contar que, se ocultar o var_dump(), apenas as mensagens de erro aparecerão, facilitando uma busca.

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.