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:
Opção de escolher pasta ORIGEM
opção de escolher pasta DESTINO
Na pasta ORIGEM:
Abrir o primeiro arquivo TXT (que tem um email por linha+Enter)
Ver qual servidor do primeiro email - exemplo: @teste.com.br
Criar um arquivo chamado “teste.com.br” na pasta DESTINO
Mover todos os emails @teste.com.br deste arquivo origem para o arquivo destino
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);
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.
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).