Perlによる,YY-BOARDからスレッド天国への投稿データ移行処理

YY-Boardからスレッド天国へのデータ移行 (掲示板)

フリーの掲示板,YY-BOARDを使っていたが, 諸事情によりスレッド天国を使うことにした.

...要は,こっちの方が便利に思えたからなんですが.

で,その時に使い捨てで作成した,投稿データ移行用の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>」→「&br;」).漢字コード変換要
編集/削除キー$keyCookieとの照合用なので移行データには不要.適当な固定値とする
投稿日時$tim$date.ただしフォーマット変換要(yyyy/mm/dd() hh:mi → time関数値)
IPアドレス$ipa$hostをDNSで引いて求まるIPアドレス
ホスト名$rmh$host

注意すべきポイントは,

  • 漢字コード変換 (SJIS→EUC)
  • 投稿日時のフォーマット変換
  • ホスト名からのIPアドレス導出

となる.

移行プログラム(Perl)

yy2ten.pl

#!/usr/bin/perl

# 移行後データで使用するスレッド番号の開始
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;

# 全行を出力する
for ($i = 0; $i <= $#t_lines; $i++) {
    print $maxnum - $i . "<>$t_lines[$i]\n";
}


# 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>/&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";
}

# ホスト名から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";
}

独り言

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

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

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

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

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

kamolandをフォローしましょう


© 2017 KMIソフトウェア