トップページ >
コンピュータ関連 >
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
| |