2011-06-01 64 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