トップページ > コンピュータ関連 > table2csv.pl

#!/usr/bin/perl

################################################################################
#
# table2csv - html table tag -> csv converter
#
# date: 2006/03/15
# update: 2005/03/19
#

$debug = 0;

########################################
# input HTML from standard input

foreach(<>){
    chomp;
    $html .= $_;
}


########################################
# modify HTML tags
# HTMLタグ無いの文字を

# to lower
#$html =~ s//<\/td>/ig;

# delete tags
#$html =~ s/<[\/]*font[^>]*>//ig;
#$html =~ s/<[\/]*b>//ig;

# delete configration in tags
#$html =~ s/ [a-z]*=\"#[0-9a-f]*\"//ig;
#$html =~ s/ [a-z]*=#[0-9a-f]*//ig;

# delete cr,lf,tab
$html =~ s/\r\n//g;
$html =~ s/\n//g;
$html =~ s/\r//g;
$html =~ s/\t//g;
$html =~ s/  +//g;


# add tag and return
#$html =~ s/]*>/\t\n/ig;
#$html =~ s/<\/tr>/\t<\/tr>\n/ig;
#$html =~ s//<\/td>\n/ig;

$html =~ s/
//ig; #$html =~ s/]*>/g; #print "\n"; #print $html =~ m//go; #print $+ . "\n"; #print $html . "\n"; #print "LENGTH: " . length($html) . "\n"; ######################################## # make array HTML and TEXT # HTMLを、テキストとタグに分離して、配列を生成します。 $intag = 0; # 0:タグ外 1:タグ内 $text = ""; # 通常テキストとタグが分解された配列 for ($i=0 ; $i <= length($html) ; $i++){ # 1文字取得する $letter = substr($html,$i,1); if($letter eq "<"){ # if($letter eq "<" and $intag == 0){ ######################################## ## 開けタグが出現した場合 (新規タグ開始) ######################################## # 出力変数にテンポラリから文字を吐き出す push(@text,$tmp); # 新規にテンポラリに文字を格納する $tmp = $letter; # タグ内であることを示す $intag = 1; # }elsif($letter eq "<" and $intag == 1){ # ######################################## # ## 開けタグが出現した場合 (閉じタグが無いまま) # ######################################## # # # 出力変数にテンポラリから文字を吐き出す # # "<"を含むが、タグ解析しない通常文字として扱う # push(@text,$tmp); # # # 新規にテンポラリに文字を格納する # $tmp = $letter; # # # タグ内であることを示す(これは必須では無い) # $intag = 1; # }elsif($letter eq ">" and $intag == 0){ # ######################################## # ## 閉じタグが出現した場合 (非タグの状態で) # ######################################## # # # 出力変数にテンポラリから文字を吐き出す # $return .= $tmp; # # # 新規にテンポラリに文字を格納する # $tmp = $letter; # # # タグ外であることを示す # $intag = 0; # }elsif($letter eq ">" and $intag == 1){ ######################################## ## 閉じタグが出現した場合 (タグの正常閉じ) ######################################## # テンポラリに文字を格納する $tmp .= $letter; # 出力変数にテンポラリから文字を吐き出す push(@text,$tmp); $tmp = ""; # タグ外であることを示す $intag = 0; }else{ ######################################## ## その他の文字の場合 ######################################## # 文字をスタックする $tmp .= $letter; } } ######################################## # make BASE ARRAY DATA for CSV # @textに格納された、テキストとタグに分離された配列より、 # タグを判断してCSV生成用の基礎配列を作成する。 # date: 2006/03/18 # update: 2006/03/19 $row = 0; # レコード番号 $col = 0; # フィールド番号 #$csvarray[$row][$col] = ""; # CSV作成用配列 #$csvchk[$row][$col] = ""; # 1:入力済み other:未入力 $mode = 0; for($i = 0 ; $i <= $#text ; $i++){ $_ = $text[$i]; # 空要素の場合は、次要素へ if(length() <= 0){ next ; } # タグ、非タグそれぞれの処置 if( m/^<.*>$/i ){ # タグの場合 if( m/
1){ for($rs = $row + 1 ; $rs <= $row + $rowspan - 1 ; $rs++){ # printd("\$rs = $rs"); $csvarray[$rs][$col] = $tmp; $csvchk[$rs][$col] = 1; } $rowspan = 0; } if($colspan > 1){ for($cs = $col + 1 ; $cs <= $col + $colspan - 1 ; $cs++){ # printd("\$cs = $cs"); # $csvarray[$row][$cs] = $tmp; $csvchk[$row][$cs] = 1; } $colspan = 0; } $tmp = ""; $col++; }elsif($mode == 2){ # trタグ閉じの場合(異常閉じ) }elsif($mode == 1){ # tableタグ閉じの場合(異常閉じ) } $mode = 2; }elsif( m/<\/tr/i ){ if($mode == 3){ # tdタグ閉じの場合(異常閉じ) }elsif($mode == 2){ # trタグ閉じの場合(正常閉じ) $col = 0; $row++; }elsif($mode == 1){ # tableタグ閉じの場合(異常閉じ) } $mode = 1; }elsif( m/<\/table/i ){ if($mode == 3){ # tdタグ閉じの場合(異常閉じ) }elsif($mode == 2){ # trタグ閉じの場合(異常閉じ) }elsif($mode == 1){ # tableタグ閉じの場合(正常閉じ) } $mode = 0; }else{ # その他のタグの場合 if($mode == 3){ # tdタグ閉じの場合 } } }else{ # 非タグの場合 if($mode == 3){$tmp .= $text[$i];}; $ret = $_; } # print $ret ; # print "\n"; } ######################################## # make CSV from BASE ARRAY DATA # 配列をCSVに変換します。 # date: 2006/03/18 # update: 2006/03/19 # # 変換時にデータ内容を次の用に改編しています。 #  ・1つのダブルクォーテーションを2つにする " -> "" #@csvarray = $row = ""; # 行配列 $col = ""; # フィールド要素 foreach $row(@csvarray){ # 初期化 $ret = ""; # レコード内のフィールドをまとめて格納 foreach $col(@{$row}){ $col =~ s/"/""/g; #"(emacs表示色対策コメント) $ret .= "\"$col\","; } # 末尾の","を削除する chop $ret; # レコードのCSVテキストを出力 print $ret . "\n"; } exit 0; # # CODE END # ######################################## ######################################## # # functions # #################### # print debug message # name: chy # date: 2006/3/19 sub printd($){ my($val) = @_; my $message = $val; if($debug != 1){ return 1; } if(length($debug_title) <= 0){ $debug_title = "DEBUG: " } print $debug_title; print $message . "\n"; return 0; }

トップページ > コンピュータ関連 > table2csv.pl