差分表示


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)

&ltitle(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";
}
--)
----


**独り言
 やってみると両掲示板とも,管理しているデータ項目はほぼ同じなんだなこれが.
まぁ,似た機能のものを選んでいるということはあるんですが.

同じなので楽ではあったが,ある種のアホらしさも感じた.
掲示板の機能や見せ方が変わっても,データはそのまま使えるというのが理想なんだがな.

しかし,ここらへんを深く追求して手間をかけるのが嫌なので,掲示板は自作せずにフリーのもので済ませているわけだから,

-見せ方を変えたいたびに,データ移行を行う必要がある

という現状を,受け入れるしかないわけか.仕方ない.


© 2019 KMIソフトウェア