Ir para conteúdo

POWERED BY:

Arquivado

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

gtsplus

[Resolvido] Expressão Regular

Recommended Posts

Boa noite pessoal!

 

Gostaria de poder contar com a ajudade de vocês.

Não tenho experiência em Expressões Regulares, tentei fazer uma, que deu meio certo, segue ela abaixo:

 

 

<?php

$arq = fopen("lixo.txt", 'a+');

preg_match('/[0-9]{6} T03.*/',$arq,$x);

echo '<pre>';

print_r($x);

echo $atual = fgets ($arq);

 

O conteudo do arquivo lixo é esse abaixo:

 

090320 T01 7894000200019 0000100000000000499000000000049900000000000000000000000L00200700142010091314:28

090320 T01 7894000200019 0000100000000000499000000000049900000000000000000000000L00200700142010091314:28

090320 T03 0000000000000001000000000000100000000000000000000000000L00200700142010091314:28

 

O resultado esperado era toda linha T3:

090320 T03 0000000000000001000000000000100000000000000000000000000L00200700142010091314:28

 

Porém recebi a linha T01:

090320 T01 7894000200019 0000100000000000499000000000049900000000000000000000000L00200700142010091314:28

 

Eu só preciso capturar a linha T03

 

O que esta errado?

 

Desde de já obrigado a todos!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites


preg_match("/\n?(\d{6} T03 .+)\n?/s",$arq,$x);

Compartilhar este post


Link para o post
Compartilhar em outros sites

preg_match("/\n?(\d{6} T03 .+)\n?/s",$arq,$x);

Obrigado pela dica, mas você não vai acreditar, retornou o mesmo valor T01, veja abaixo:

 

090320 T01 7894000200019 0000100000000000499000000000049900000000000000000000000L00200700142010091314:28

 

script

 

<?php

$arq = fopen("lixo.txt", 'a+');

preg_match("/\n?(\d{6} T03 .+)\n?/s",$arq,$x);

echo '<pre>';

print_r($x);

echo $atual = fgets ($arq);

 

?>

Isso só ocorre quando eu uso o método fopen, se no lugar do fopen eu colocar o texto já aberto funciona, porén não é isso que eu quero, eu gostaria de abrir o arquivo com o fopen, e por meio de uma Expressão Regular fazer a leitura da linha T03, mas não consigo fazer isso.

 

Se tiver outra dica ficarei grato.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso tá estranho, mas tenta assim:

preg_match('/^[0-9]{6} ?T03[a-zA-Z0-9:_ .-]+$/',$arq,$x);

EDITADO. TENTE AGORA

 

:huh:

Estamos vivendo um mistério, retornou T01, está retornado sempre a primeira linha do arquivo, são várias linhas, e T03 é a ultima, porém só retorna a primeira ou seja T01.

 

Seria pedir demais, seu eu mandar o arquivo para você?

 

Desde já muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Anexa todos ao tópico, mas verei isso somente amanhã de noite.

 

Troque a função por preg_match_all.

 

Estranho isso, pois ali temos bem explícito o T03. Ele deveria pegar somente a linha que contém T03.

 

Tenta isso também, a título de teste:

 

preg_match('/T03[a-zA-Z0-9:_ .-]+$/',$arq,$x);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensa bem, você tem um arquivo e quer procurar alguma coisa específica em uma linha.

 

Qual a primeira coisa que te vêm em mente? Pra mim, seria obter um array a partir desse arquivo/string.

 

Se for um arquivo, como seu caso, use file(), que abre o arquivo, lêe retorna um array tendo cada índice como sendo uma linha do mesmo.

 

Depois disso como você aplicaria uma ER em cada linha? Muitos podem responder foreach seguido de um preg_match.

 

Eu diria que é melhor, fazer direto com preg_grep()

 

Olha como ficou mais simples, acomeçar pela própria ER que não requer mais quantificadores, listas, opcionais e sei lá mais o quê:

 

$text = <<< TEXT
090320 T01 7894000200019
0000100000000000499000000000049900000000000000000000000L00200700142010091314:28
090320 T01 7894000200019
0000100000000000499000000000049900000000000000000000000L00200700142010091314:28
090320 T03 0000000000000001000000000000100000000000000000000000000L00200700142010091314:28
TEXT;

$text = explode( "\n", $text );

$matches = preg_grep( '/(.*?T03.*?)/', $text );

print '<pre>'; print_r( $matches );

Saída:

 

Array
(
   [4] => 090320 T03 0000000000000001000000000000100000000000000000000000000L00200700142010091314:28
)

Nota: Usei explode() pois fiz a análise emcima de uma variável, ao invés de um arquivo.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem Expressão regular.

 

function retornaTrecho($var, $inicio, $nDigitos){    
                                //retorna a parte solicitada da string $var (a contagem inicia-se em zero)
                                $inicio = $inicio-1;
                                // "<br/>";
                                $nDigitos = $nDigitos-$inicio;//+1
                                // "<br/>";
                                return substr($var, $inicio,$nDigitos );
  }
  $arquivo = 'cupom.txt';//ou o arquivo recebido.
  $fp = @fopen($arquivo, "r");
  while (!feof($fp)) {
     $buffer = fgets($fp, 4096); // Aqui pega o conteudo da linha toda.
     /*
     1ª coluna --> Nº do cupom --> Tamanho 06 digitos --> Inicio 01 --> Fim 06
     2ª coluna --> Nº do pedido --> Tamanho 08 digitos --> Inicio 07 --> Fim 14
     3ª coluna --> Tipo documento --> Tamanho 01 digitos --> Inicio 15 --> Fim 15
     4º coluna --> Tipo registro --> Tamanho 02 digitos --> Inicio 16 --> Fim 17
     5º coluna --> Cod. Prod. PLU --> Tamanho 20 digitos --> Inicio 18 --> Fim 37
     6ª coluna --> Tipo Produto --> Tamanho 01 digitos --> Inicio 38 --> Fim 38
     7ª coluna --> Campo Quantida --> Tamanho 08 digitos --> Inicio 39 --> Fim 46
     8ª coluna --> Valor Unitário --> Tamanho 12 digitos --> Inicio 47 --> Fim 58
     9ª coluna --> Valor Total --> Tamanho 12 digitos --> Inicio 59 --> Fim 70
     */
     $nr_cupom = retornaTrecho($buffer, 001, 006);
     $nr_pedido = retornaTrecho($buffer, 007, 014);
     /*[...]Aqui você coloca as outras variaveis e seus respectivos trechos e depois trabalha com os dados como quiser*/
  }

Para ler arquivos .RET de retorno de banco que vem em texto. Utilizo este conceito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensa bem, você tem um arquivo e quer procurar alguma coisa específica em uma linha.

 

Qual a primeira coisa que te vêm em mente? Pra mim, seria obter um array a partir desse arquivo/string.

 

Se for um arquivo, como seu caso, use file(), que abre o arquivo, lêe retorna um array tendo cada índice como sendo uma linha do mesmo.

 

Depois disso como você aplicaria uma ER em cada linha? Muitos podem responder foreach seguido de um preg_match.

 

Eu diria que é melhor, fazer direto com preg_grep()

 

Olha como ficou mais simples, acomeçar pela própria ER que não requer mais quantificadores, listas, opcionais e sei lá mais o quê:

 

$text = <<< TEXT
090320 T01 7894000200019
0000100000000000499000000000049900000000000000000000000L00200700142010091314:28
090320 T01 7894000200019
0000100000000000499000000000049900000000000000000000000L00200700142010091314:28
090320 T03 0000000000000001000000000000100000000000000000000000000L00200700142010091314:28
TEXT;

$text = explode( "\n", $text );

$matches = preg_grep( '/(.*?T03.*?)/', $text );

print '<pre>'; print_r( $matches );

Saída:

 

Array
(
   [4] => 090320 T03 000000000000000[b]1032[/b]000000000103200000000000000000000000L00200700142010091314:28
)

Nota: Usei explode() pois fiz a análise emcima de uma variável, ao invés de um arquivo.

 

:D

 

Muito obrigado funcionou certinho http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

 

Deixa eu te perguntar uma coisa, para extrair do resultado de saida apenas o valor 1032, que está em negrito o que devo fazer? Tentei usar o substr não deu certo imagino que tenha de jogar o conteúdo do indice [4] para dentro de uma variável e depois usar o comando substr: exemplo

 

[4] => 090320 T03 0000000000000001032000000000103200000000000000000000000L00200700142010091314

 

De qualquer forma sou muito grato pela ajuda, obrigado mesmo

 

sem Expressão regular.

 

function retornaTrecho($var, $inicio, $nDigitos){    
                                //retorna a parte solicitada da string $var (a contagem inicia-se em zero)
                                $inicio = $inicio-1;
                                // "<br/>";
                                $nDigitos = $nDigitos-$inicio;//+1
                                // "<br/>";
                                return substr($var, $inicio,$nDigitos );
  }
  $arquivo = 'cupom.txt';//ou o arquivo recebido.
  $fp = @fopen($arquivo, "r");
  while (!feof($fp)) {
     $buffer = fgets($fp, 4096); // Aqui pega o conteudo da linha toda.
     /*
     1ª coluna --> Nº do cupom --> Tamanho 06 digitos --> Inicio 01 --> Fim 06
     2ª coluna --> Nº do pedido --> Tamanho 08 digitos --> Inicio 07 --> Fim 14
     3ª coluna --> Tipo documento --> Tamanho 01 digitos --> Inicio 15 --> Fim 15
     4º coluna --> Tipo registro --> Tamanho 02 digitos --> Inicio 16 --> Fim 17
     5º coluna --> Cod. Prod. PLU --> Tamanho 20 digitos --> Inicio 18 --> Fim 37
     6ª coluna --> Tipo Produto --> Tamanho 01 digitos --> Inicio 38 --> Fim 38
     7ª coluna --> Campo Quantida --> Tamanho 08 digitos --> Inicio 39 --> Fim 46
     8ª coluna --> Valor Unitário --> Tamanho 12 digitos --> Inicio 47 --> Fim 58
     9ª coluna --> Valor Total --> Tamanho 12 digitos --> Inicio 59 --> Fim 70
     */
     $nr_cupom = retornaTrecho($buffer, 001, 006);
     $nr_pedido = retornaTrecho($buffer, 007, 014);
     /*[...]Aqui você coloca as outras variaveis e seus respectivos trechos e depois trabalha com os dados como quiser*/
  }

Para ler arquivos .RET de retorno de banco que vem em texto. Utilizo este conceito

 

Muito obrigado, gostei da lógica aplicada, funcionou certinho http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

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.