Perlによる,YY-BOARDからスレッド天国への投稿データ移行処理 YY-Boardからスレッド天国へのデータ移行 (掲示板)フリーの掲示板,YY-BOARDを使っていたが, 諸事情によりスレッド天国を使うことにした. ...要は,こっちの方が便利に思えたからなんですが. で,その時に使い捨てで作成した,投稿データ移行用のPerlスクリプトを公開してみることにします.
やはり,掲示板が変わると投稿が全て消えるというのは,寂しいものがありますからな.特に投稿が少ない場合は.
前提
データ移行の概要
データ1行の構造
このように行の単位が違うので,スレッド天国に移す際には注意が必要. 移行時には,同一スレッドの投稿を拾って,スレッド毎に1行にまとめる必要がある.
項目の対応関係
注意すべきポイントは,
となる.
移行プログラム(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"; }
独り言やってみると両掲示板とも,管理しているデータ項目はほぼ同じなんだなこれが. まぁ,似た機能のものを選んでいるということはあるんですが.同じなので楽ではあったが,ある種のアホらしさも感じた. 掲示板の機能や見せ方が変わっても,データはそのまま使えるというのが理想なんだがな. しかし,ここらへんを深く追求して手間をかけるのが嫌なので,掲示板は自作せずにフリーのもので済ませているわけだから,
という現状を,受け入れるしかないわけか.仕方ない. |