Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Парсер Txt файла (https://forum.antichat.xyz/showthread.php?t=55588)

Xszz 12.12.2007 01:34

Парсер Txt файла
 
Доброго времени суток .
если у кого есть минутка , напишите плиз парсер который будет парсить текстовый файл вида :
Код:

123@mail.ru
123@rambler.ru
123@qwe.ru

И удалять все поля кроме рамблера .
Спасибо.

C!klodoL 12.12.2007 01:59

open(FILE, '<incom.txt');
while(<FILE>) {
print $_ if $_ =~ /rambler/;
}

юзать C:\>pars.pl > выходной файл

Xszz 12.12.2007 02:25

Спасибо огромное

vp$ 12.12.2007 02:41

PHP код:

<?php
@set_time_limit(0);
$ft fopen ("list.txt""r");
 while (!
feof($ft))
   { 
$str trim(fgets($ft100));
      if (
strpos($str,'@rambler.ru')>0)
        {
          
$fd fopen ("rambler.txt""a+");
            
fwrite ($fd$str);
            
fwrite ($fd"\n");
            
fclose ($fd);
        }
   }
    
fclose ($ft);
?>


ENFIX 12.12.2007 02:48

PHP код:

$fd fopen ("rambler.txt""a+"); 
            
fwrite ($fd$str); 
            
fwrite ($fd"\n"); 
            
fclose ($fd); 

Не думаю, что есть гуд открывать и закрывать файл внутри цикла.

Имхо перл в самый раз, а пшп тут, так скажем, отсасывает

demonoid 12.12.2007 16:50

Цитата:

Сообщение от C!klodoL
open(FILE, '<incom.txt');
while(<FILE>) {
print $_ if $_ =~ /rambler/;
}

юзать C:\>pars.pl > выходной файл

*лучше использовать строковое равно
Код:

#!perl
use strict;
use warnings;
my $file = shift||exit print "usage : $0 <file>";
open( my $F, '<',$file)|| exit print $!;
while( <$F> )
{
    $_=~/\@(\w+)/;
    print $_  if $1 eq 'rambler';
}


biophreak 12.12.2007 16:54

Хм...не обязательно :)....это не тупое сравнение, это сравнение по шаблону ( =~ )
В твоем варианте лишний гемор с регекспом ))))
И еще хорошо было бы модификаторы io поставить в шаблоне :))

ЗЫЖ А то сталкивался с любителями писать мыла а-ля (@Rambler.Ru @RAMBLER.RU итд) ))))
ЗЗЫЖ В примере C!klodoL будет еще ловить мыла а-ля *rambler*@somehost.com.... лучше будет в шаблоне юзать что-нибудь типа \@rambler.ru
Ну это так, если уже по коду пошли )

demonoid 12.12.2007 17:00

Смотрим примеры которые дал ТС :D
Теперь в парсер который написал C!klodoL
положим мыло ramblerko@gmail.com
biophreak прикольно отредактировал не успел я ответ написать .
Еще раз повторяю ориентируемся на примеры ТС

biophreak 12.12.2007 17:05

Добавляем ровно 4 символа в пример C!klodoL =)) :

open(FILE, '<incom.txt');
while(<FILE>) {
print $_ if $_ =~ /\@rambler/io;
}

Вуаля :))))

Ну примеры, он видимо тут и придумывал, а ктож знает какая там у него база мыл.... :)))))

C!klodoL 12.12.2007 17:29

Цитата:

Сообщение от biophreak
Добавляем ровно 4 символа в пример C!klodoL =)) :

open(FILE, '<incom.txt');
while(<FILE>) {
print $_ if $_ =~ /\@rambler/io;
}

Вуаля :))))

Ну примеры, он видимо тут и придумывал, а ктож знает какая там у него база мыл.... :)))))

но тогда может попасть мыло типа @rambler.com 8)
если уж совсем точно то;
open(FILE, '<incom.txt');
while(<FILE>) {
print $_ if $_ =~ /\@rambler\.ru/i;
}

biophreak 12.12.2007 17:34

ну да :) а еще .info .org .mobi и так далее )))))

Tarigonik 12.12.2007 18:13

А теперь делаем оптимизацию и убираем 9 лишних символов )))

open(FILE, '<incom.txt');
while(<FILE>) {
print if /\@rambler\.ru/i;
}

biophreak 12.12.2007 18:39

Ну и если совсем упростить и минимизировать :)))))

open(F, 'incom.txt'); while(<F>){ print if /\@rambler.ru/i }

:D

Tarigonik 12.12.2007 18:51

Я специально не стал стал изменять имена дескриптора и файлов, перевод строк и тд, но раз уж на то пошло:
open(F,'i');while(<F>){print if /\@rambler.ru/i}

biophreak 12.12.2007 18:52

Добавлю отдельный твик :)))

while(<>){ print if /\@rambler.ru/i }

Юзать как file.pl file_with_mails.txt
Жду ответа :))))
))))

scrat 12.12.2007 19:10

PHP код:

<?php
$f
=file("мыльники.txt");
for(
$i=0;$i<count($f);$i++) strpos($f[$i],"rambler") ? echo $f[$i] : continue;
?>


nerezus 12.12.2007 19:12

"оптимизация на размер исходника" - мне фраза кажется глупой ;)

C!klodoL 12.12.2007 19:12

Код:

$ cat incom.txt
lol@rambler.ru
fofofo@mail.ru
ramblerko@mail.ru
fgfgf@RaMbLer.ru

$ grep -i @rambler.ru incom.txt
lol@rambler.ru
fgfgf@RaMbLer.ru


Tarigonik 12.12.2007 19:17

Вариант 1
Могу только пробелы убрать )
while(<>){print if /\@rambler.ru/i}
И запускать как f.pl i ))

Вариант 2 аka жесткий твик =)
while(<>){print if /\@r(.+)r.ru/i}
Выгода - 1 символ ))
Лично я не знаю подобного почтовика кроме рамблера

nerezus, да мы просто балуемся (или если хочешь - меряемся письками :)

Scipio 12.12.2007 19:51

PHP код:

<?php 
error_reporting
(E_ALL); 
set_time_limit(0); 
$fr=fopen("mail.txt","r"); 
$fw=fopen("rambler.txt","w"); 
while (!
feof ($fr)) { 
    
$buffer fgets($fr,255); 
    
$buffer strtolower($buffer); 
    
$log=explode('@',$buffer,2); 
    
$log[1]=trim($log[1]);
  if (
$log[1]=='rambler.ru'fputs($fw,$buffer); 
  

echo 
"OK!"
fclose($fr); 
fclose($fw); 
?>


как мне написали explode() не рулит, лучше strpos...

это так, просто скрипт брал из этого:
http://forum.antichat.ru/thread54946.html

strpos рулит не всегда кстати

Digimortal 12.12.2007 20:43

Цитата:

Сообщение от Tarigonik
nerezus, да мы просто балуемся (или если хочешь - меряемся письками :)

на самом деле это называется PERL-golfing.. +)

кста, вот мой вариант кода ; )..
Код:

/@rambler\.ru/i&&print for<>
(заменять rambler на r(.+)r считаю "грязным хаком".. : ) )

blackybr 12.12.2007 20:43

Код:

perl -ne "/r.r/&&print" mails.txt
ну или как вышесказавший.. r(.+)r.ru.. все равно чистого кода в первом случае 12 символов, во втором - 16.. что в три раза меньше самого маленького, что предложил Tarigonik


ЗЫ дижимортал опередил на несколько секунд)))) гг.. не видел

+ без грязного хака )))

Код:

perl -ne "/rambler.ru/&&print" mails.txt
все равно чистого кода на несколько символов меньше чем у диджи))

Tarigonik 12.12.2007 22:13

Цитата:

/@rambler\.ru/i&&print for<>
Незачет - слеш забыл перед собачкой ))
Цитата:

(заменять rambler на r(.+)r считаю "грязным хаком".. : ) )
А я так и написал - "жесткий твик" )
Цитата:

perl -ne "/r.r/&&print" mails.txt
Очень ненадежно, могут левые мыльники всплыть (как в логине, так и в домене) и модификатор i надо добавить
Цитата:

perl -ne "/rambler.ru/&&print" mails.txt
Тоже самое - надо бы собаку добавить, а к ней и слеш + самое главное - модификатор i для разных регистров ;)

blackybr 12.12.2007 22:19

тогда оптимально будет что-то вроде

Код:

perl -ne "/\@r(.+?)r.r/i&&print" mails.txt
есть еще варианты? :))

Tarigonik 12.12.2007 22:27

Вариант есть, точнее исправление:
perl -ne "/\@r(.+)r.r/i&&print" mails.txt
Непонятно, зачем ты туда ? добавил. (.+) значит один или несколько символов, больше ниче не надо.



blackybr: привычка :)
думаю автор получил что хотел, да и мы померились размерами :) клозед

db_reader 18.02.2008 23:25

Извиняюсь за поднятую тему.

Но если к примеру есть текстовый документ с мэйлами, такого формата:
Цитата:

# 7 says: (Posted: October, 2007 12:12:12 PM)

abbi@yahoo.com::abbie
Возможно ли наоборот удалить с помощью скрипта всё, кроме мыла и ника, т.е. чтоб формат вышел такого вида:

abbi@yahoo.com::abbie

Если есть возможность помочь, буду благодарен, т.к. в php не силён.

Isis 19.02.2008 10:56

PHP код:

<?php 
$fp 
fopen("mail.txt","rb"); 
while (!
feof ($fp))

    
$out fgets($fr255);
    if(
strpos($out'@') !== false)
    {
        
$new_fp fopen("new_mail.txt","wb"); 
        
fputs($new_fp$out);
    } 

fclose($fp); 
fclose($new_fp); 
?>


db_reader 19.02.2008 16:49

Isis -огромное спасибо, что откликнулся. Но при попытке пропарсить на локалхосте, выдаёт кучу ошибок
Цитата:

Notice: Undefined variable: fr in z:\home\localhost\www\1.php on line 5

Warning: fgets(): supplied argument is not a valid stream resource in z:\home\localhost\www\1.php on line 5
Имя базы поставил такое же, mail.txt
В чём может быть проблемма?
0_o

Isis 19.02.2008 17:17

PHP код:

<?php 
$fp 
fopen("mail.txt","rb"); 
while (!
feof ($fp))

    
$out fgets($fp255);
    if(
strpos($out'@') !== false)
    {
        
$new_fp fopen("new_mail.txt","wb"); 
        
fputs($new_fp$out);
    } 

fclose($fp); 
fclose($new_fp); 
?>


db_reader 19.02.2008 17:35

Работает ! :)
только выдирает по одной записи, начиная с последней :(. Если я из базы удаляю последнюю запись, то он записывает в файл предидущую.
Но только одну. :(

NOmeR1 19.02.2008 17:45

PHP код:

<?php
    $old_file_name 
'mails.txt';
    
$new_file_name 'new_mails.txt';
    
$new_array = array();
    foreach(
explode("\n"file_get_contents($old_file_name)) as $string) {
        if(
preg_match('~[A-Za-z0-9\._-]+@[A-Za-z0-9\._-]+::.+~'$string)) {
            
$new_array[] = $string;
        }
    }
    
$fopen fopen($new_file_name'a');
    
fwrite($fopenimplode("\n"$new_array));
    
fclose($fopen);
?>

Не тестил

db_reader 19.02.2008 18:20

Ай да красавчег! Работает! Спасибо огромнейшее! Спасибо всем, кто помогал.

DRON-ANARCHY 20.02.2008 05:36

как-то php выглядит с одной стороны роднее, а с другой такой гигантизм прям по сравнению я перловкой)

кстати, а че ежели сначала замутить
strtolower($mails);
а потом тупо выдергивать строки, в которых есть
'@rambler.ru'

по-моему будет проще регулярок. хотя хз

Developer 20.02.2008 15:06

PHP код:

<?php

$file 
file('mail.txt');

foreach (
$file as $mail) {
    if (
strpos($mail'@rambler.ru') !== false) {
        echo 
$mail;
    }
}


Developer 20.02.2008 15:09

Полная версия (с выводом в новый файл):

PHP код:

<?php

$file 
file('in.txt');

foreach (
$file as $mail) {
    if (
strpos($mail'@rambler.ru') !== false) {
        
$out[] = $mail;
    }
}

$file fopen('out.txt''w');
fputs($fileimplode(''$out));
fclose($file);


ThreeD 09.04.2008 12:02

Приветствую, прошу прощения, что апнул тему...
В общем есть база вида:

lsben@yahoo.com::goodmorning

что следует изменить в вышеприведённом коде, для отсеивания имен и составления списка чистых мыл, вида:

lsben@yahoo.com

Или выложите плз рабочий кусок кода, т.к. в php не силён :(
Заранее благодарен, с ув. ThreeD

t00th 09.04.2008 12:46

Цитата:

Сообщение от ThreeD
Приветствую, прошу прощения, что апнул тему...
В общем есть база вида:

lsben@yahoo.com::goodmorning

что следует изменить в вышеприведённом коде, для отсеивания имен и составления списка чистых мыл, вида:

lsben@yahoo.com

Или выложите плз рабочий кусок кода, т.к. в php не силён :(
Заранее благодарен, с ув. ThreeD

open(IN,"mails.txt") || die "cant open file man!";
while(<IN>) {
print $1."@".$2,"\n" if /(\w+)\@(.*?)::(\w+)/;
}

ThreeD 09.04.2008 12:58

Работает :) Забыл файл с мылами переименовать :)
Спасибо +!

t00th 09.04.2008 13:09

Цитата:

Сообщение от ThreeD
Не работает :(

эээ...
это Perl,если что
У меня все работает,проверял


Время: 06:07