PDA

Просмотр полной версии : Парсер Txt файла


Xszz
12.12.2007, 01:34
Доброго времени суток .
если у кого есть минутка , напишите плиз парсер который будет парсить текстовый файл вида :
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
@set_time_limit(0);
$ft = fopen ("list.txt", "r");
while (!feof($ft))
{ $str = trim(fgets($ft, 100));
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
$fd = fopen ("rambler.txt", "a+");
fwrite ($fd, $str);
fwrite ($fd, "\n");
fclose ($fd);


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

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

demonoid
12.12.2007, 16:50
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
Добавляем ровно 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
$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
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
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
$fp = fopen("mail.txt","rb");
while (!feof ($fp))
{
$out = fgets($fr, 255);
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
$fp = fopen("mail.txt","rb");
while (!feof ($fp))
{
$out = fgets($fp, 255);
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
$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($fopen, implode("\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

$file = file('mail.txt');

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

Developer
20.02.2008, 15:09
Полная версия (с выводом в новый файл):

<?php

$file = file('in.txt');

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

$file = fopen('out.txt', 'w');
fputs($file, implode('', $out));
fclose($file);

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

lsben@yahoo.com::goodmorning

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

lsben@yahoo.com

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

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

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
Не работает :(
эээ...
это Perl,если что
У меня все работает,проверял