Как автоматизировать этот процесс? - PullRequest
1 голос
/ 01 июня 2011

Включает переписывание .htm в .txt (выходной файл)

затем с помощью парсера (синтаксический анализатор грамматики Стэнфорда) (выходной файл)

для всех файлов в каталоге.

МОЙ ВОПРОС: Я хотел бы получить все файлы в каталоге, не делая это вручную, и найти способ запустить парсер, не вводя его в терминал для каждого файла.

Вот мой код:

#!/usr/bin/perl
use strict;
use warnings;
use HTML::FormatText;
use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new->parse_file("chpt15Intro.htm");

use HTML::FormatText;

my $formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 1000);
   #print $formatter->format($tree); is replaced by push
push (my @files, $formatter->format($tree));
foreach my $files (@files) {
    $files =~ s/^\s+//mg;
    open MYFILE, ">ch15Intro.txt"; 
    select MYFILE; 
    print $files;
}

В Terminal после преобразования html-файла пишу:

script parsedch15Intro.txt ./lexparser.csh ch15Intro.txt

чтобы сохранить вывод парсера. Этот шаг все еще нуждается в автоматизации.

Я новичок, так что спасибо за любой совет.

Ответы [ 5 ]

2 голосов
/ 02 июня 2011

Попробуйте заменить строку 6 (my $tree = HTML::TreeBuilder->new->parse_file("chpt15Intro.htm");) на это:

my $tree = HTML::TreeBuilder->new;
$tree->parse_file("chpt15Intro.htm");

В документах CPAN для HTML :: TreeBuilder не упоминается, что является возвращаемым значением parse_file, если оно есть, но я подозреваю, что это , а не экземпляр, в котором был вызван метод. Это означает, что после вызова ваша переменная $tree не имеет никакого значения.

1 голос
/ 02 июня 2011

Я понял из вашего вопроса, что вы хотите применить этот скрипт ко всем (html-) файлам в определенной папке и вывести их текстовые версии.

Таким образом, простое решение состоит в том, чтобы просто заменить жестко закодированные имена файлов переменными и выполнить цикл вокруг @ARGV, например Аргументы сценария, например, так:

for my $file (@ARGV) {
    next unless ($file =~ /^(.+).html*$/i);
    my $outfile = $1 . ".txt";
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file); # credit to Phil for this one
    my $formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 1000);
    foreach my $files ($formatter->format($tree)) {
        $files =~ s/^\s+//mg;
        open my $fh, '>', $outfile or die $!; 
        print $fh $files;
    }
}

Как видите, я кое-что почистил. Используйте так:

> script.pl *.htm
1 голос
/ 02 июня 2011

Вы можете передать несколько файлов через командную строку, используя globbing , который будет расширяться оболочкой.

./lexparser *.html

Все имена файлов, заканчивающиеся на «.html», затем доступны в @ARGV. Если ваш сценарий должен принимать только имена файлов в качестве аргументов, просто переберите @ARGV, чтобы получить каждое имя входного файла, обрабатывая входной файл в теле цикла. Например:

for my $in (@ARGV) {
    my $out = $in;
    $out =~ s/(\.html?)?$/.txt/;
    ...
}

Если вы хотите, чтобы ваш сценарий использовал дополнительные параметры (например, для установки расширения для выходных файлов или для установки префикса или суффикса для выходных файлов), обработайте @ARGV перед обработкой файлов. Вы можете написать свой собственный дополнительный процессор или использовать один из Getopt модулей.

Примечание: расширение .csh указывает на сценарий оболочки C. Для Perl используйте «.pl», если вы хотите использовать расширение вообще (обычно это не нужно, поскольку строка shebang несет информацию о типе сценария).

0 голосов
/ 02 июня 2011

ОБНОВЛЕНИЕ : ответ на вопрос об автоматизации синтаксического анализатора: (аналогично решениям TLP и outis)

#!/usr/bin/perl
use strict;
use warnings;

for my $file (@ARGV) {
    next unless ($file =~ /^(.+).txt*$/i); ##file name ends in txt
    my $outfile = "parsed$1".".txt";
    qx/script -q \/Users\/jon\/Desktop\/stanford-postagger-full-2011-04-20\/$outfile \.\/lexparser.csh $file/;
}
##First in Terminal cd /Users/jon/Downloads/chpt1-8 or whichever directory this perl script and all texfiles and parser files are
##Called in Terminal by ==>  perl auto_parse.pl *.txt

##This saves the output to directory spedicifed. The output is the parsed files
##Required: stanford parser files in same directory as this script
0 голосов
/ 02 июня 2011

Не решение Perl, но вы можете сделать это как однострочное с этим конвейером оболочки,

при условии

  • у вас есть текстовый браузер lynx установлено (доступно ли на Mac?)

  • и в вашей системе установлена ​​оболочка sh :

    ls -1 mydir / *. html |xargs -i sh -c "lynx -dump '{}'> '{} .txt'"

. Это создает кучу файлов * .html.txt в одном каталоге.И текст может быть не отформатирован в соответствии с вашими требованиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...