ufrrj99 0 Denunciar post Postado Dezembro 26, 2016 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 ORIGEM2) opção de escolher pasta DESTINO Na pasta ORIGEM:3) Abrir o primeiro arquivo TXT (que tem um email por linha+Enter)4) Ver qual servidor do primeiro email - exemplo: @teste.com.br 5) Criar um arquivo chamado "teste.com.br" na pasta DESTINO6) Mover todos os emails @teste.com.br deste arquivo origem para o arquivo destino7) 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 encontradosforeach ($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 removidosif (!empty($found)) {file_put_contents($file, implode('', $arr));} }// salva todos os nomes encontradosif (!empty($found)) {file_put_contents($base.'silva.txt', implode(PHP_EOL, $found));} unset($found, $arr); Compartilhar este post Link para o post Compartilhar em outros sites
washalbano 54 Denunciar post Postado Dezembro 27, 2016 <?php // defina a pasta base $base = 'txts' . DIRECTORY_SEPARATOR; // Diretório onde estão os arquivos txt. // defina a pasta destino $destino = null; $files = glob($base . '*.txt'); // Pega todos os arquivos que terminam com .txt // verificar se algum arquivo foi encontrado: if (sizeof($files)) { // inicia variável para guardar erros $erros = null; // Itera os arquivos encontrados foreach ($files as $file) { // inicia variáveis: $separated_emails = null; // Lê cada arquivo em um array, ignora linhas vazias $emails = file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); // executa função para separar emails por domínio separate_emails_by_domain($emails); // se algum email válido foi encontrado if (sizeof($separated_emails)) { // percorre os emails válidos encontrados foreach ($separated_emails as $k => $founded) { // transforma o array $founded em uma string $linha = implode(PHP_EOL, $founded) . PHP_EOL; // abre o $arquivo para gravação $file_save = fopen($destino . $k . '.txt', 'a'); // grava a linha de dados no $arquivo fwrite($file_save, $linha); // fecha o $arquivo fclose($file_save); } // Exibe mensagem na tela: echo '<p class="ok">Emails válidos do arquivo: <b>' . $file . '</b>, foram salvos com sucesso, chefe!</p>'; } else { // se nenhum email válido for encontrado echo '<p class="error">Nenhum email válido foi encontrado para o arquivo: <b>' . $file . '</b>, chefe"</p>'; } } // se houve algum erro if (sizeof($erros)) { // mostra os erros na tela foreach ($erros as $e) { echo $e; } } } else { // se nenhum arquivo foi encontrado: echo '<p class="error">Nenhum arquivo encontrado na pastinha: <b>' . $base . '</b>, chefe!</p>'; } function separate_emails_by_domain(array $emails, $index = 0) { global $separated_emails, $file, $erros; // pega o primeiro email: $email = $emails[$index]; // verifica se é um email válido: if (filter_var($emails[$index], FILTER_VALIDATE_EMAIL)) { // pegar o domínio do email if (preg_match('/(?P<dominio>@([\w\- ]+\.)+([\w\-]{2,3}))$\b/', $email, $matches)) { $dominio = $matches['dominio']; // percorrer o array $emails e separar todos com domínio igual a $dominio foreach ($emails as $k => $value) { if (strpos($value, $dominio) && filter_var($value, FILTER_VALIDATE_EMAIL)) { $separated_emails[$dominio][] = $value; // remover a linha do array unset($emails[$k]); } } } } else { // se o email for inválido: $erros[] = '<p class="error"><b>ERRO!!!</b> Email inválido chefe! Arquivo: <b>' . $file . ': ' . $email . '</b>!!!</p>'; // remove a linha do email inválido unset($emails[$index]); } // se ainda houver alguma linha em $emails if (sizeof($emails)) { // verifica a próxima linha separate_emails_by_domain(array_values($emails)); } } Compartilhar este post Link para o post Compartilhar em outros sites