Просмотр полной версии : Парсер 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 > выходной файл
<?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);
?>
$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
Жду ответа :))))
))))
<?php
$f=file("мыльники.txt");
for($i=0;$i<count($f);$i++) strpos($f[$i],"rambler") ? echo $f[$i] : continue;
?>
"оптимизация на размер исходника" - мне фраза кажется глупой ;)
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, да мы просто балуемся (или если хочешь - меряемся письками :)
<?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 не силён.
<?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
<?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
Работает ! :)
только выдирает по одной записи, начиная с последней :(. Если я из базы удаляю последнюю запись, то он записывает в файл предидущую.
Но только одну. :(
<?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);
Приветствую, прошу прощения, что апнул тему...
В общем есть база вида:
lsben@yahoo.com::goodmorning
что следует изменить в вышеприведённом коде, для отсеивания имен и составления списка чистых мыл, вида:
lsben@yahoo.com
Или выложите плз рабочий кусок кода, т.к. в php не силён :(
Заранее благодарен, с ув. 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+)/;
}
Работает :) Забыл файл с мылами переименовать :)
Спасибо +!
Не работает :(
эээ...
это Perl,если что
У меня все работает,проверял
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot