Ir para conteúdo

POWERED BY:

Arquivado

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

drop3

Acrescentando delimitadores em .txt

Recommended Posts

Olá amigos!

 

Tenho um arquivo .txt e gostaria de incluir delimitadores do tipo ";","|", no fim de cada campo.

Este é o arquivo com os registros:

Imagem Postada

 

Gostaria que ao final de cada nome tivesse um delimitador como falado antes. Ex:

 

MARIO ROBERTO GASTALDI | MILZA MARIA DOS SANTOS | 19660716

 

Se puderem ajudar! http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isto vai depender de como você esta gerando estes campos.

Você tem o código ai?

 

Não, eu recebi este arquivo já desta forma, isto é, foi exportado já dessa forma. Pretendia então acrescentar os delimitadores pelo php.

Compartilhar este post


Link para o post
Compartilhar em outros sites
$input = fopen('arquivo.txt','rb');
$output = fopen('arquivo_delimitado.txt','wb');
while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));
fclose($input);
fclose($output);

Compartilhar este post


Link para o post
Compartilhar em outros sites

aHHh, saquei...

 

Você pode usar funções como substr() e explode() para fazer isso.

 

Eu pensei em retirar os 3 campos usando substr (já que o tamanho é padrão) e depois jogar os espaços fora com explode, ai você junta tudo com o delimitador que você quiser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$input = fopen('arquivo.txt','rb');
$output = fopen('arquivo_delimitado.txt','wb');
while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));
fclose($input);
fclose($output);

 

Deu este erro:

Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs... on line 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

aHHh, saquei...

 

Você pode usar funções como substr() e explode() para fazer isso.

 

Eu pensei em retirar os 3 campos usando substr (já que o tamanho é padrão) e depois jogar os espaços fora com explode, ai você junta tudo com o delimitador que você quiser.

 

Mais como retirar os campos se não tenho o tamanho deles? Poderia exemplificar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

vacilo meu

 

antes

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

depois

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('/\b\t/','\b | \t',$linha));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais como retirar os campos se não tenho o tamanho deles? Poderia exemplificar?

 

O Evandro deu uma resposta muito mais simples.

XD

Compartilhar este post


Link para o post
Compartilhar em outros sites

vacilo meu

 

antes

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

depois

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('/\b\t/','\b | \t',$linha));

Foi uma boa, mais ele simplismente duplicou o arquivo com outro nome (arquivo_delimitado.txt) e sem escrever o delimitador http://forum.imasters.com.br/public/style_emoticons/default/excl.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

esses espaços são TAB's ou SPACE's ??

 

se forem espaços digitados um a um no teclado não vai dar mesmo, vai ter que fazer outra substituição:

 

antes

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

depois

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b','\b | ',$linha));

 

para nos resumirmos no processo desse tópico, vamos nos focar apenas nesta parte aqui:

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

OK?

Compartilhar este post


Link para o post
Compartilhar em outros sites

São SPACE´S, a base foi gerada com tamanho padrão para os campos. Logo deveria dar certo. A dúvida é como contar os espaços e substituir eles?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A minha última sugestão, SE trabalhar no seu arquivo vai bagunçar todos os nomes, ignore-a

 

com ER você não precisa contar.

já vi que é um pouco mais complexo do que parecia ser.

 

troque

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

por

while (false !== ($linha = fgets($input))) {
    $linha = preg_replace('(  )*','\t',$linha); // aqui trocamos apenas espaços duplos por TAB's
    $linha = preg_replace(' ?$','',$linha);     // aqui removemos qualquer espaço remanescente antes da quebra de linha
    $linha = preg_replace('\t',' | \t',$linha); // por fim, adicionamos o delimitador
    fputs($output,$linha);                      // gravamos a saída
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

:(

Nada feito:

 

 

Warning: preg_replace() [function.preg-replace]: Unknown modifier '*' in C:\xampp\htdocs\... on line 5

 

Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\... on line 6

 

Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\... on line 7

 

Acredito que a última sugestão:

 

while (false !== ($linha = fgets($input))) fputs($output,preg_replace('\b\t','\b | \t',$linha));

Dava mais certo, o problema era tratar "preg_replace('\b\t','\b | \t',$linha));"

Compartilhar este post


Link para o post
Compartilhar em outros sites

to sem condições de fazer testes, pois não estou no laboratório habitual...

 

mas vamos por tentativa e erro.. não desista!

procure estudar um pouquinho de expressões regulares e fazer suas tentativas por conta própria tb (duas cabeças pensam melhor que uma)

 

 

a última eu fiz tão correndo (horário de almoço) que esqueci os delimitadores... vamos lá

while (false !== ($linha = fgets($input))) { 
    $linha = preg_replace('(  )*','\t',$linha); // aqui trocamos apenas espaços duplos por TAB's 
    $linha = preg_replace(' ?$','',$linha);     // aqui removemos qualquer espaço remanescente antes da quebra de linha 
    $linha = preg_replace('\t',' | \t',$linha); // por fim, adicionamos o delimitador 
    fputs($output,$linha);                      // gravamos a saída 
}

vira

while (false !== ($linha = fgets($input))) { 
    $linha = preg_replace('/\b {2,}/',' | \t',$linha);
    // troca bordas de palavra seguidas de 2 ou + espaços por um espaço, delimitador, espaço e um tab
    fputs($output,$linha);                      // gravamos a saída 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas vamos por tentativa e erro..

Hummm, tentativa e erro é muito caro, hehehe

 

$arquivo = 'arquivo.txt';

file_put_contents( $arquivo , preg_replace( '/(\s{2,})/' , '$1|' , file_get_contents( $arquivo ) ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

mas vamos por tentativa e erro..

Hummm, tentativa e erro é muito caro, hehehe

 

$arquivo = 'arquivo.txt';

file_put_contents( $arquivo , preg_replace( '/(\s{2,})/' , '$1|' , file_get_contents( $arquivo ) ) );

 

Poxa, valeu o socorro, João. Ontem tava sem condições de testar, senão faria a tentativa-e-erro aqui, seria rapidinho ;)

Tenho que me habituar a utilizar o \s ao invés de espaços

 

 

Não seria mais fácil um simples ctrl + h do bloco de notas?

 

Aí toda vez que precisarem fazer o parse no arquivo gerado, eles ligam pra você "dar um ctrl + h"????? to fora!

 

 

 

 

drop3, o João solucionou o problema com uma iteração mais simples ainda que a proposta. Se desejar um espaço APÓS o delimitador, basta trocar

'$1|'
por
'$1| '

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.