Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Поиск значения в текстовой базе


Автор: Podkovka 15.11.2011, 09:54
Прошу помощи в реализации куска кода.
Имеем текстовый файл TheTVDB.txt вида:
name_show id_show
Код
Antiques.Roadshow.UK 83774
Antiques.Roadshow 75117
Call.Me.Fitz 191101
Swamp.Wars 249372
Austin.City.Limits 71649
60.Minutes.US 73290
Call.of.the.Wildman 253415
Hung 82091
My.Extreme.Animal.Phobia 252795
Homeland 247897
IRT.Deadliest.Roads 194271
Squidbillies 79017
The.Next.Iron.Chef 80665

Имеем входную переменную $release_name вида Call.Me.Fitz.S02E07.720p.HDTV.x264-2HD
Необходимо сделать последовательный (т.к. возможно двойное совпадение, например, Antiques.Roadshow.UK и Antiques.Roadshow) перебор в текстовом файле и при совпадении присвоить переменной $ID_Show значение после  name_show, в противном случае $ID_Show=0.
Как мне кажется, нужно брать данные из TheTVDB.txt и сравнивать с $release_name, т.к. ключ в TheTVDB.txt короче значения $release_name (Call.Me.Fitz - Call.Me.Fitz.S02E07.720p.HDTV.x264-2HD).
Вид файла TheTVDB.txt можно изменить, если не удобен в обработке, т.к. создается вручную.
На много меня не хватило smile
Код

#!/usr/bin/perl -w
my $release_name = "Call.Me.Fitz.S02E07.720p.HDTV.x264-2HD";
my $file = "/home/user/TheTVDB.txt";
my %from = ();
open (TheTVDB,"$file") || die "Can't open $file : $!";
#находим совпадение (Call.Me.Fitz) и присваиваем ID (191101)
close TheTVDB;

Автор: arto 15.11.2011, 11:32
# perl -aF"\\s+" -lne 'BEGIN{$id=shift}$id=~m#^\Q$F[0]\E#&&print$F[1]' Call.Me.Fitz.S02E07.720p.HDTV.x264-2HD file
191101
#

Автор: Podkovka 15.11.2011, 12:39
@arto
Спасибо, великолепное решение. Но я новичок в perl  и для меня one-liner решение как дремучий лес smile
Если Вас не затруднит, прошу показать пример в "классическом" виде.

Автор: dixoNICH 15.11.2011, 12:50
Код

open f, "file.txt" or die "$!";
$/ = \0;
my $idshow = 0;
my $file = <f>;
my $release_name = "Call.Me.Fitz.S02E07.720p.HDTV.x264-2HD";
$release_name =~/(.+)\.S\d{2}E\d{2}/;
$idshow = $1 if $file=~/$1\s(\d+)/;

Автор: Podkovka 15.11.2011, 16:19
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)