差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
Perlによる,YY-BOARDからスレッド天国への投稿データ移行処理
//parent=掲示板ツール
*YY-Boardからスレッド天国へのデータ移行 (掲示板)
フリーの掲示板,&link(YY-BOARD,http://www.kent-web.com/);を使っていたが,
諸事情により&link(スレッド天国,http://specters.net/cgipon/);を使うことにした.
...要は,こっちの方が便利に思えたからなんですが.
で,その時に使い捨てで作成した,投稿データ移行用のPerlスクリプトを公開してみることにします.
やはり,掲示板が変わると投稿が全て消えるというのは,寂しいものがありますからな.特に投稿が少ない場合は.
~
(でも,消えた方が良いという場合も,あり得ないとは言えないのが何ともデリケートだったりしますが,
それは別の話ということで)
**前提
-スレッド天国 ver1.10 (tengoku_110.zip)
-YYBBS ver4.8
-jcode.pl
**データ移行の概要
***データ1行の構造
,YY-BOARD,スレッド天国
,1投稿=1行,1スレッド=1行.複数投稿がある場合,「<>」区切りで1行内に連結する
このように行の単位が違うので,スレッド天国に移す際には注意が必要.
移行時には,同一スレッドの投稿を拾って,スレッド毎に1行にまとめる必要がある.
***項目の対応関係
,項目の意味(スレッド天国),項目名(スレッド天国),項目名,説明(YY-BOARD)
,スレッド番号,$num,データ移行時に自動採番する
,投稿者名,$nam,$name.漢字コード変換要
,投稿者E-Mail,$mal,$mail
,投稿者URL,$url,$url
,アイコン,$ico,$icon
,文字色,$col,$color
,タイトル,$mtt,$sub.漢字コード変換要
,本文,$mes,$comment.改行記号の変換要(「<br>」→「&verb(&)br;」).漢字コード変換要
,編集/削除キー,$key,Cookieとの照合用なので移行データには不要.適当な固定値とする
,投稿日時,$tim,$date.ただしフォーマット変換要(yyyy/mm/dd() hh:mi → time関数値)
,IPアドレス,$ipa,$hostをDNSで引いて求まるIPアドレス
,ホスト名,$rmh,$host
注意すべきポイントは,
-漢字コード変換 (SJIS→EUC)
-投稿日時のフォーマット変換
-ホスト名からのIPアドレス導出
となる.
**移行プログラム(Perl)
<itle(yy2ten.pl);
--(
&verb(#)!/usr/bin/perl
#!/usr/bin/perl
&verb(#) 移行後データで使用するスレッド番号の開始
# 移行後データで使用するスレッド番号の開始
my($startnum) = 1;
@y_lines;
@t_lines;
use Time::Local;
require './jcode.pl';
my($first) = 1;
while (<STDIN>) {
if ($first == 1) {
$first = 0;
} else {
push(@y_lines, $_);
}
}
my($num) = $startnum;
foreach (@y_lines) {
my($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$icon) = split(/<>/);
my($t_line);
if ($reno eq '') {
# スレッドの親投稿である
$t_line = convline($_);
# 同じスレッドの投稿を検索する
foreach (@y_lines) {
my($no0,$reno0,$date0,$name0,$mail0,$sub0,$comment0,$url0,$host0,$pw0,$color0,$icon0) = split(/<>/);
if ($reno0 eq $no) {
# 同じスレッドの投稿内容を連結する
$t_line = $t_line . '<>' . convline($_);
}
}
# 1本のスレッドの親〜全ての子を,1行として配列に格納する
push(@t_lines, $t_line);
$num++;
}
}
my($i);
my($maxnum) = $num - 1;
&verb(#) 全行を出力する
# 全行を出力する
for ($i = 0; $i <= $#t_lines; $i++) {
print $maxnum - $i . "<>$t_lines[$i]\n";
}
&verb(#) yybbsのデータ行をスレッド天国のデータに変換する
&verb(#) 文字コード変換(SJIS→EUC)も行う
# yybbsのデータ行をスレッド天国のデータに変換する
# 文字コード変換(SJIS→EUC)も行う
sub convline {
my($y_line) = @_;
my($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$icon) = split(/<>/, $y_line);
my($nam,$mal,$mtt,$mes,$key,$tim,$ipa,$rmh);
$nam = $name;
&jcode::sjis2euc(\$nam);
$mal = $mail;
&jcode::sjis2euc(\$mal);
$mtt = $sub;
&jcode::sjis2euc(\$mtt);
$mes = $comment;
&jcode::sjis2euc(\$mes);
$mes =~ s/<br>/&verb(&)br;/g;
$mes =~ s/<br>/&br;/g;
$key = "";
$tim = $date;
# 「2004/03/30(Tue) 23:23」 という形式をtime関数値(秒数)にフォーマット変換する
$tim =~ /^(\d+)\/(\d+)\/(\d+)\(\w+\) (\d+):(\d+)$/;
my($y,$m,$d,$h,$mi) = ($1, $2, $3, $4, $5);
$tim = timelocal(0,$mi,$h,$d,$m-1,$y);
$ipa = getaddrfromhost($host);
$rmh = $host;
return "$nam>$mal>$url>$icon>$color>$mtt>$mes>$key>$tim>$ipa>$rmh";
}
&verb(#) ホスト名からIPアドレスを求める
# ホスト名からIPアドレスを求める
sub getaddrfromhost {
my($hostname) = @_;
($name, $aliases, $addrtype, $length, @addrs) = gethostbyname($hostname);
($a, $b, $c, $d) = unpack('C4', $addrs[0]);
return "$a.$b.$c.$d";
}
--)
----
**独り言
やってみると両掲示板とも,管理しているデータ項目はほぼ同じなんだなこれが.
まぁ,似た機能のものを選んでいるということはあるんですが.
同じなので楽ではあったが,ある種のアホらしさも感じた.
掲示板の機能や見せ方が変わっても,データはそのまま使えるというのが理想なんだがな.
しかし,ここらへんを深く追求して手間をかけるのが嫌なので,掲示板は自作せずにフリーのもので済ませているわけだから,
-見せ方を変えたいたびに,データ移行を行う必要がある
という現状を,受け入れるしかないわけか.仕方ない.