Manipulação de arquivos com PHP | Ricardo Brusch
Início › Desenvolvimento › Manipulação de arquivos com PHP
Em muitas ocasiões precisamos que nossa aplicação se envolva muito além do próprio código que geramos. Nesses casos, o que buscamos não nos será disponibilizado através de uma entrada do usuário, um formulário ou muito menos através do banco de dados. As vezes precisamos manipular dados que nos chegam através de arquivos como os .txt ou os .csv . E neste caso, precisamos trabalhar com funções um pouco mais avançadas do PHP.
Neste post vou mostrar um pouquinho (só a pontinha do iceberg) de como trabalhamos para manipular estes arquivos. Como sempre, vou abordar tudo de maneira extremamente didática. Tenho a opinião que o difícil é sempre começar a desenvolver algo que não conhecemos. Depois que temos o primeiro contato fica bem mais fácil dar continuidade no aprendizado, pois já temos a ideia de como aquilo funciona e onde procurar conteúdos mais avançados sobre o assunto.
Bom, vamos nessa então…
Começamos criando um arquivo .txt qualquer. Segue um "exemplo.txt", com o conteúdo:
Sou um arquivo de teste.
Mais uma linha chegando...
E aqui eu acabo.
Vamos lê-lo agora? Crie um arquivo .php com o seguinte código:
$arquivo = fopen('exemplo.txt', 'r');
echo fgets($arquivo) . "<br />";
Linha 3: abrimos o arquivo com a função fopen(), e armazenamos seu conteúdo na variável $arquivo. Esta função recebe dois parâmetros normalmente, sendo o primeiro o caminho e nome do arquivo e o segundo o modo de abertura do mesmo. O modo 'r' significa que estamos abrindo o arquivo somente para leitura. Os diversos modos de abertura você encontra no Manual PHP (veja aqui)
Linha 4: Iniciamos um laço while testando o arquivo com a função foef(). Esta serve para testar se estamos no final do arquivo que passamos por parâmetro à ela. Perceba a negação ( ! ) antes da função. Neste caso, queremos que o laço se repita enquanto não estivermos no final deste arquivo.
Linha 5: Apresento na tela, com o "echo" a linha atual que se encontra o ponteiro, com a função fgets(). No próximo ciclo do laço while, o fgets() lerá a próxima linha, e assim por diante até chegar no final do arquivo e o laço acabar.
Linha 8: Fechamos o arquivo. A função fclose() retorna TRUE ou FALSE em casos de sucesso ou erro, respectivamente.
Fácil? Creio que sim… Próximo exemplo 😉
Escrevendo em Arquivos com PHP
Imagine-se agora na seguinte situação: O site da companhia que você trabalha disponibiliza um cadastro de e-mail para recebimento de newsletters. Os e-mails cadastrados ficam salvos em um arquivo .txt no servidor, e não no banco de dados. Agora seu chefe solicita que você integre um formulário de cadastro de clientes do sistema, pegando os e-mails deste cadastro e adicionando nesta lista. Como fazer isto diretamente no arquivo? Vejamos o exemplo abaixo:
Este é o arquivo com a lista de e-mails já registrados (emails.txt):
emailUm@teste.com.br;
emailDois@teste.net;emailTres@teste.com.br;
E este é o código para adicionar um e-mail ao final do arquivo acima:
$adicionar = "\r\n"."novoEmail@exemplo.com.br;";
$arquivo = fopen('emails.txt', 'a');
fwrite($arquivo, $adicionar);
Linha 3: aqui temos o e-mail que queremos adicionar ao arquivo. A string '\r\n' concatenada no início da string serve simplesmente para quebrarmos uma linha antes de inserir o dado no arquivo. É totalmente opcional, mas é indicado por organização. Fica mais legível ler um arquivo onde cada dado está disposto em uma linha diferente.
Linha 4: fopen() abre o arquivo especificado, lembra? O parâmetro 'a' significa que abriremos o arquivo para escrita, e colocaremos o ponteiro no final, para que qualquer adição de conteúdo seja feita exatamente no fim deste arquivo.
Linha 5: usamos a função fwrite() para escrever no arquivo já aberto. Veja o primeiro parâmetro. Passamos exatamente a variável que está "segurando" o arquivo. O segundo parâmetro indica o conteúdo que estamos querendo adicionar.
Linha 7: Fechamos o arquivo.
Após isto, o arquivo "emails.txt" ficará assim:
novoEmail@exemplo.com.br;
Fácil, não? Não esqueça que para o PHP poder escrever no arquivo, este precisa estar com permissão de escrita.
Que tal um pouco mais incrementado agora?
Gerando novos Arquivos com PHP
Imagine isto: Seu chefe agora lhe deu uma nova tarefa. Você precisa gerar um novo arquivo .txt a partir da lista de e-mails anterior, só que nesta lista só podem aparecer os e-mails com terminação ".com.br". Como vamos fazer isto agora?? Observe:
$novoConteudo = '';
$arquivo = fopen('emails.txt', 'r');
while(($data = fgetcsv($arquivo, 0, ';')) !== false) {
if (strstr($data[$i], '.com.br')) {
$novoConteudo.= "{$data[$i]};"."\r\n";
$novoArquivo = fopen('novaLista.txt', 'w');
fwrite($novoArquivo, $novoConteudo);
Hmm…. começou a complicar agora né? Que nada. A função só ficou mais incrementada que antes, e se você der uma refatorada esse código com certeza ele ficara ainda mais agradável e menos assustador. Vamos linha a linha entender o seu funcionamento.
Linha 3: Estou criando uma variável vazia (auxiliar), onde vou armazenar todos os dados que quero adicionar no novo arquivo a ser criado.
Linha 4: Estou abrindo como leitura o arquivo "emails.txt".
Linha 6: Um laço while com condições do capeta, hehehe… Entenda-as: em primeiro lugar, utilizo uma nova função, fgetcsv(), que funciona de modo parecido com a fgets() do primeiro exemplo. A diferença é que esta trata o arquivo como um CSV, e não simplesmente como um txt. Através dela, posso passar diversos parâmetros, sendo os que utilizei:
– Primeiro Parâmetro ('$arquivo') – passo aqui a variável que "mantém" o arquivo aberto.
– Segundo Parâmetro (0) – Defino o tamanho máximo que cada linha deste arquivo pode ter. Se passo ZERO, como no caso, estou definindo que não sei este tamanho máximo. A função fica um pouco mais lenta para executar desta forma, mas para este exemplo isto é imperceptível.
– Terceiro Parâmetro (';') – É aqui que defino qual é o separador de dados deste arquivo. No exemplo, cada e-mail é separado por um ponto-e-vírgula, portanto a função pega a linha, procura pelo separador, e armazena o(s) registro(s) em um array (neste caso, na variável $data). Isso é repetido linha a linha graças ao laço while.
Por fim, ainda na linha 6, defino que isso só vai ser repetido enquanto a variável $data (onde está o array com os dados) realmente exista. Isto impede que o laço se torne um loop infinito quando cair no final do arquivo.
Linha 8: O laço for serve para percorrer todos os itens do array armazenado em $data, uma vez que posso ter um número indefinido de e-mails separados por ponto-e-vírgula em cada linha do arquivo. O limite deste laço é quando atingir o número total de posições do array $data neste loop.
Linha 9 e 10: O IF em questão verifica se há a ocorrência da string ".com.br" na posição atual do array ( $data[$i] ),com a função strstr(). Se isto é confuso para você, sugiro dar uma olhadinha nos tutoriais sobre arrays com PHP disponíveis na net. Se a condição for verdadeira, concateno este e-mail na variável auxiliar criada lá no começo do código, juntamente com o ponto-e-virgula e o '\r\n' no final, quebrando a linha para esperar o próximo registro. Fazendo isso, garantimos que apenas os e-mails que estão de acordo com o que seu chefe solicitou seja armazenado na variável $novoConteudo;
Linha 15: Fechamos o arquivo aberto anteriormente.
Linha 17: Abrimos agora, no modo escrita, o arquivo "novaLista.txt". Mas como se este arquivo não existia antes? A função fopen() cria o arquivo para você se ele não existir, desde que obviamente você tenha permissão de escrita no diretório em questão.
Linha 18: A função fwrite(), que você já conhece do exemplo anterior, grava o novo conteúdo sobre o novo arquivo.
Linha 20: Fechamos o novo arquivo.
Prontinho.. A explicação ficou grande, mas somente porque queria passar os detalhes sobre o exemplo citado. Enfim, não é nem um pouco difícil entendê-lo, basta estudar o código com calma e é claro, dar uma olhada no Manual PHP
Estou a disposição para dúvidas e/ou auxílio para melhor entendimento das funções e dos códigos acima. Basta comentar abaixo ou mandar e-mail para contato@ricardobrusch.com.br . Desaconselho esta segunda opção, pois assim o conhecimento trocado não ficará disponível à todos, mas de qualquer forma, estou a disposição.
Um forte abraço aos amigos e desenvolvedores que chegaram até aqui e lembre-se: Venere o grande pinguim! huahuahuhauhuahua