如何自动化这个过程?

时间:2011-06-01 19:29:11

标签: perl macos terminal

它涉及将.htm重写为.txt(输出文件)

然后使用解析器(stanford语法解析器)(输出文件)

表示目录中的所有文件。

我的问题:我想获取目录中的所有文件,而不是手动完成,并找到运行解析器的方法,而不必为每个文件键入终端。

这是我的代码:

#!/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;
}

终端中,在转换html文件后,我写道:

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

保存解析器的输出。这一步仍然需要自动化。

我是初学者,所以感谢您的任何建议。

5 个答案:

答案 0 :(得分:2)

尝试用以下代码替换第6行(my $tree = HTML::TreeBuilder->new->parse_file("chpt15Intro.htm");):

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

HTML :: TreeBuilder的CPAN文档没有提到parse_file的返回值是什么,如果有的话,但我怀疑它是该方法被调用的实例上。这意味着在通话结束后,您的$tree变量没有任何意义。

答案 1 :(得分:1)

您可以使用globbing通过命令行传递多个文件,shell将展开。

./lexparser *.html

所有以'.html'结尾的文件名随后都可在@ARGV中找到。如果您的脚本只将文件名作为参数,只需循环@ARGV以获取每个输入文件名,在循环体中处理输入文件。例如:

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

如果希望脚本采用其他选项(例如设置输出文件的扩展名,或为输出文件设置前缀或后缀),请在处理文件之前处理@ARGV。您可以编写自己的option processor或使用其中一个Getopt模块。

注意:'。csh'的扩展名表示C shell脚本。对于Perl,如果你想使用扩展名,则使用'.pl'(通常不需要,因为shebang行包含有关脚本类型的信息)。

答案 2 :(得分:1)

我从你的问题中得知,你要做的是将这个脚本应用于某个文件夹中的所有(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

答案 3 :(得分:0)

不是perl解决方案,但你可以使用这个shell管道进行单线程,

假设

  • 您安装了纯文本浏览器 lynx (可以在mac上使用吗?)

  • 并且系统上有 sh Shell:

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

这会在同一目录中创建一堆* .html.txt文件。并且文本可能未根据您的要求进行格式化

答案 4 :(得分:0)

UPDATE :以下是自动化解析器的答案:(类似于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