2011-06-01 61 views
1

它包括重写的.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; 
} 

在的终端,让转换后的HTML文件后,我写:

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

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

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

+2

你到底想达到什么目的?你有什么困难?当寻求帮助时,说出你想要什么/期望以及你有什么/正在发生什么。除了您遇到的特定问题之外,请务必描述总体目标。阅读[“写完美的问题”](http://tinyurl.com/so-hints)以获取更多指导。 – outis 2011-06-01 19:32:33

+0

@outis:对不起,我还在学习,我已经更新了这个问题,请告知我是否需要更多内容。 – Jon 2011-06-01 19:57:19

+0

“my $ tree = HTML ...”的缩进让我有些失望。假设你没有做任何特别的事情,我很想念你,我会为你解答一些问题。 – Panky 2011-06-01 20:02:20

回答

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 
+0

真棒!我喜欢粘贴在一起的答案!非常感谢。我绝对可以从这里获得解析器 – Jon 2011-06-01 22:23:15

+0

@Jon欢迎您:) – TLP 2011-06-01 22:30:33

2

尝试更换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变量没有任何意义。

+0

非常感谢,我会看看如果这解决了我的一些问题 – Jon 2011-06-01 20:56:09

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,如果您想使用扩展名(通常没有必要,因为shebang行包含关于脚本类型的信息),请使用'.pl'。

+0

感谢您的帮助!尤其是知识和链接。我敢肯定,它会帮助做一个多文件解析 – Jon 2011-06-01 22:32:37

+0

此外,globbing没有按原样工作,因为终端命令'脚本'需要输出文件名的第一个参数,我想匹配*在你的:_ *。html_ 所以我现在正在处理... – Jon 2011-06-01 22:46:20

+0

@Jon:循环体句柄的前两行:生成输出文件名,而不是在命令行上传递它。如前所述,您还可以通过在命令行中设置前缀,后缀或扩展名来支持自定义输出文件名称。 – outis 2011-06-02 01:11:19

0

不是一个Perl的解决方案,但你可以做到这一点作为一个班轮这个壳的管道,

假设

  • 你有纯文本浏览器安装山猫(是可在Mac吗?)

  • 且有SH您的系统上的外壳:

    ls -1 mydir/*。html | xargs的-i SH -c “猞猁突降 '{}'> '{}的.txt'”

这造成在同一目录下一堆* .html.txt文件。和文本可能会根据您的要求

+0

很酷的东西,感谢您的选择。我刚开始学习Perl,现在我也想学习shell脚本,功能强大! – Jon 2011-06-02 13:19:21

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