0

<TR>HTMLタグからすべての行データを抽出する 1 つのスクリプトを作成しました。<TR>HTML ページに30 個の HTMLタグがあります。カウントに基づいて、私のコードは特定の行データをフェッチします。5th<tr>...</tr>に存在するデータが必要な場合、私の条件はif(count =5) {(go inside and get that data)}

しかし、ここでの問題は、選択した行のデータを一度に 1 つずつ必要とすることです。行 5、6、および 14 のデータが必要だとします。

整理するのを手伝ってくれませんか?

$te = new HTML::TableExtract(count => 0 );
$te->parse($content);
# Examine all matching tables
foreach $ts ($te->table_states) {
    #print "Table (", join(',', $ts->coords), "):\n";
    $cnt = 1;
    foreach $row($ts->rows) {
        # print " ---- Printing Row $cnt ----\n";
        $PrintLine= join("\t", @$row);
        @RowData=split(/\t/,$PrintLine);
        $PrintLine =~ s/\r//ig;
        $PrintLine =~ s/\t//ig;
        $cnt = $cnt + 1;
        #   if ($PrintLine =~ /Site ID/ig || $PrintLine =~ /Site name/ig){print " Intrest $PrintLine $cnt =====================\n"};
        if ( $cnt == 14) { 
            $arraycnt = 1;
            my $SiteID="";
            my $SiteName="";
            foreach (@RowData) {
                # print " Array element $arraycnt\n";
                chomp;
                $_ =~ s/\r//ig;
                $_ =~ s/[\xC3\xA1\xC3\xA0\xC3\xA2\xC3\xA3]//ig;
                if ($arraycnt== 17 ) { $SiteID= $_;}
                if ($arraycnt== 39 ) { $SiteName= $_;}
                    $arraycnt = $arraycnt + 1;
            } 
            #$PrintLineFinal = $BridgeCase."\t".$PrintLine;
            $PrintLineFinal = $BridgeCase."\t".$SiteID."\t".$SiteName;
            #print "$PrintLineFinal\n";
            print MYFILE2 "$PrintLineFinal\n";          
            last;
        }       
    }
}
4

2 に答える 2

0

いくつかの提案:

いつも:

 use strict;
 use warnings;

これにより、変数をで宣言する必要がありますmy。例えば

foreach my $ts ($te->table_states) {
   my $cnt = 1;

warningsほとんどのばかげた間違いについて知らせます。strict特定の場合に、より良い方法を使用するように要求することで、間違いを防ぎます)。

いくつかの場所では、配列を調べながら独自のカウンター変数を使用しています。これを行う必要はありません。代わりに、必要な配列要素を直接取得してください。たとえば$array[3]、3番目の要素を取得します。

Perlでは、配列スライスで必要な特定の要素だけを取得することもできます。@array[4,5,13]配列の5番目、6番目、および14番目の要素を取得します。これを使用して、すべての行をループする代わりに、必要な行のみを処理できます。

my @rows = $ts->rows;
foreach my $row (@rows[4,5,13]) #process only the 5th, 6th, and 14th rows.
{
    ...
}

匿名配列を使用した、同じもののショートカットバージョンを次に示します。

foreach my $row (@{[$ts->rows]}[4,5,13])

また、コードの他の場所で必要な行を定義したい場合もあります。

my @wanted_rows = (4,5,13);
...
foreach my $row (@{[$ts->rows]}[@wanted_rows])

このコードはかなり混乱しています:

$PrintLine= join("\t", @$row);
@RowData=split(/\t/,$PrintLine);
$PrintLine =~ s/\r//ig;
$PrintLine =~ s/\t//ig;

最初にタブ文字で配列を結合し、次に結合したばかりの配列を分割して配列を元に戻します。次に、とにかく行からすべてのタブ文字を削除します。

そのコードをすべて取り除くことをお勧めします。@$rowアレイのコピーを作成する代わりに、必要なときにいつでも使用してください。デバッグのために配列を印刷する必要がある場合(これは、で行っているように見えるすべてです)$PrintLine、配列を直接印刷できます。

print @$row;    #print an array, nothing between each element.
print "@$row";  #print an array with spaces between each element.

これらすべての変更により、コードは次のようになります。

use strict;
use warnings;

my @wanted_rows = (4,5,13);

my $te = new HTML::TableExtract(count => 0);

$te->parse($content);
# Examine all matching tables
foreach my $ts ($te->table_states) {
    foreach my $row (@{[$ts->rows]}[@wanted_rows]) {

        s/[\xC3\xA1\xC3\xA0\xC3\xA2\xC3\xA3\r\n]//ig for (@$row);

        my $SiteID   = $$row[16] // '';  #set to empty strings if not defined.
        my $SiteName = $$row[38] // '';  
        print MYFILE2 $BridgeCase."\t".$SiteID."\t".$SiteName;
    }
}
于 2013-02-26T09:40:39.893 に答える
0

次のように結果にアクセスできます。

foreach $ts ($te->table_states) {
    #you need 14th rows
    #my 14throws = $ts->rows->[13];#starting with zero!
    #17th col from the 14th row
    #my $17colfrom14throws = $ts->rows->[13]->[16];
    my $SiteName = $ts->rows->[13]->[38];
    my $SiteID   = $ts->rows->[13]->[16];
    my $PrintLineFinal = $BridgeCase."\t".$SiteID."\t".$SiteName;
    print MYFILE2 "$PrintLineFinal\n";     
}
于 2013-02-26T09:46:32.290 に答える