PHP Alterar Lista Emails no Arquivo TXT

O PHP abaixo já funciona mas preciso automatizá-lo.
Da forma que está ele procura por determinada palavra, cria um arquivo e move todas as palavras encontradas em todos os arquivos da pasta para um único arquivo.
Agradeço por qualquer alteração ou melhoria nele.

Retirar a opção de apenas arquivos TXT e deixar ler qualquer arquivo
$files = glob($base.’*.txt’); // Pega todos os arquivos que terminam com .txt

Preciso que ele trabalhe de forma automática e fazendo o seguinte:

  1. Opção de escolher pasta ORIGEM
  2. opção de escolher pasta DESTINO

Na pasta ORIGEM:

  1. Abrir o primeiro arquivo TXT (que tem um email por linha+Enter)
  2. Ver qual servidor do primeiro email - exemplo: @teste.com.br
  3. Criar um arquivo chamado “teste.com.br” na pasta DESTINO
  4. Mover todos os emails @teste.com.br deste arquivo origem para o arquivo destino
  5. Salvar o arquivo aberto e recomeçar a partir da opção 3.

Como são vários arquivos e alguns com 300Mb então precisa fazer LOOP do 3 ao 7 para economizar memória e o computador conseguir realizar a tarefa.


$base = __DIR__.DIRECTORY_SEPARATOR; // Diretório onde estão os arquivos txt.

$files = glob($base.'*.txt'); // Pega todos os arquivos que terminam com .txt

$search = 'silva'; // a palavra que deseja buscar
$found = array();
$arr = array(); 
// Itera os arquivos encontrados
foreach ($files as $file) {

// Lê cada arquivo em um array
$arr = file($file);
foreach ($arr as $k => $v) {
    // Se encontrar a palavra, guarda no array $found e remove do array que leu o arquivo.
    if (stripos($v, $search) !== false) {
        $found[] = trim($arr[$k]);
        unset($arr[$k]);
    }
}
// Salva os dados no arquivo, com os nomes removidos
if (!empty($found)) {
    file_put_contents($file, implode('', $arr));
}

}
// salva todos os nomes encontrados
if (!empty($found)) {
file_put_contents($base.'silva.txt', implode(PHP_EOL, $found));
}

unset($found, $arr);

Olá, sugiro que se cadastre e poste sua dúvida no stackoverflow.

Creio que será mais fácil obter ajuda. Não é uma crítica, ok? É justamente para ajudar .

ps: inclusive tenho achado o GUJ muito “parado” e pouco “solícito” ultimamente =/

Imagino que você deve usar esse script como robô ao invés de página web pelo navegador certo?

Se sim, o php cria duas variáveis quando rodando em console (CLI): $argv e $argc.

Elas servem para pegar os parâmetros passados em linha de comando/dados externos na chamada do script, exemplo no linux…

$ php lista_emails.php *.txt /home/usuario/origem /home/usuario/destino

Dessa forma ele cria um array em argv, contendo 4 parâmetros (o primeiro sempre será o nome do arquivo)… e uma variável contendo a quantidade (nesse caso 4, mas o padrão mínimo é 1)…

Eu coloquei no stackoverflow e uma pessoa me ajudou a chegar nesse ponto que está.
Criei um novo post há tempos mas ninguém mais ajudou.
Vou tentar alguma ajuda aqui pra ver se tenho sucesso.
Qqr coisa volto com um upgrade do script pra lá.

Eu estou usando no próprio computador pelo xamp.
O problema é que tenho q fazer a busca manualmente e com poucos arquivos de cada vez.
Se eu colocar mais de 5 na mesma pasta trava tudo.

Eu gostaria de fazer essa busca de forma automática pois se funcionar dessa forma então vai economizar muitos dias de trabalho repetitivo. Teria q abrir um único arquivo e mover todos os emails, depois apagar o arquivo de origem e partir pro próximo.

Teria como vc me ajudar?

Bom vamos lá, a primeira coisa a se definir, o php pode ser executado por linha de comando, minha pergunta é, você vai deixar o script agendado ou vai chama-lo abrindo o navegador?

Qual a diferença? Eu explico, chamando via navegador demora mais, pois é preciso chamar o apache, etc… já por linha de comando você economiza esse tempo e a memória fica disponível para o php.

Você mencionou que os arquivos podem chegar a 300MB certo? Nesse caso evite usar a função file, pois ela carrega todo o arquivo na memória disponível do pc, utilize streams nesse caso com as funções fopen, fread/fwrite e não esqueça de fechar cada arquivo com fclose… assim você trabalha com ponteiros e a economia de memória será considerável agilizando o processo.

Já que você precisa percorrer a pasta de origem, evite usar a função glob, a scandir nesse caso é mais indicada (mas você terá de validar o arquivo manualmente pois o scandir lista todos arquivos e subpastas).

Existe uma API consistente e otimizada para trabalhar com arquivos e pastas e podem te ajudar, pesquise sobre DirectoryIterator, FileSystemIterator e as classes de arquivo