【Lifehacks】STOT形式データをTSV形式に加工する

■タスク
 STOT形式データをTSV形式に加工する。


■背景
・特定ハッシュタグに関連付いた呟きを分析したい。
別途取得したSTOT形式データを、分析しやすいようにTSV形式に加工したい。


■方法
 PerlスクリプトによりTSV形式に加工します。
 一旦TSV形式にすれば、Excelで分析したり二次加工するのも容易になります。


■仕様
・入・出力ファイルの文字コードWindows-31J (CP932)とします。

・入力ファイルはSTOT (Share Twitter On Tumblr) 形式とします。
 具体的には以下の形式です。
 - 1件1行。
 - 1件形式:USERID:TWEET [STATUSURL]
  - USERID:TwitterユーザID。
  - TWEET:呟き本体。
  - STATUSURL:呟きのURL。
 - STATUSURL形式:http://twitter.com/USERID/statuses/STATUSID
  - STATUSID:呟きのID。

・出力ファイルはTSV形式とします。
 具体的には以下の形式です。
 - 1件1行。
 - 1件形式:USERIDSTATUSIDLENGTHTITLETWEET
  - USERID:TwitterユーザID。
  - STATUSID:呟きのID。
  - LENGTH:呟き文字数。
  - TITLE:呟き仮タイトル。呟きの先頭20文字。
  - TWEET:呟き本体。


■使用方法
> perl SgTwStotToTsv.pl < Input.txt > Output.txt


■プログラム

# 
# SgTwStotToTsv.pl
# STOTからTSVに変換する。
# 
# Author: Orihika Ikuo 
# Create: 2009.09.28 twnovelオフ会対応やっつけ版。 
# Update: 2009.10.07 修正版。
# 

##### Pragma
use strict;
use warnings;
use utf8;

##### Module
use Encode;

##### Setting
our $TITLE_LEN               = 20;
our $TAG                     = "#twnovel";

##### Constant
our $ENC_SJIS                = ':encoding(:shiftjis)';
our $ENC_CP932               = ':encoding(:cp932)';
our $ENC_UTF8                = ':encoding(:utf8)';
our $ERR_ILL_FORMAT          = "ERR: Illegal format.";

# HTML Character entity reference
our @ARY_HTML_CER            = ('&quot;', '&amp;', '&lt;', '&gt;');
our @ARY_HTML_CER_ORG        = ('"',      '&',     '<',    '>'   );

##### Global
binmode STDIN,  $ENC_CP932;
binmode STDOUT, $ENC_CP932;

##### Main routine
&SgTwStotToTsv();

sub SgTwStotToTsv {
  my $dat_line;
  my $usr;
  my $tweet;
  my $status;
  my $len;
  my $title;
  my $title_wk;

  while ($dat_line = <STDIN>) {

    chomp($dat_line);

    # HTMLタグを除去する。
    $dat_line =~ s/<.*?>//g;
    $dat_line = SgCmHtmlCerToOrg($dat_line);

    if ($dat_line =~ m/(^.*?):(.*) \[http.*?statuses\/(.*)\]/) {
      # ユーザID、呟き本体、呟きIDを取得。
      $usr    = $1;
      $tweet  = $2;
      $status = $3;

      # 呟長を取得。
      $len    = length($tweet);

      # 呟きの先頭「$TITLE_LEN」文字を「タイトル」代わりに取得。
      # 先頭にtwnovelタグがある場合は除く。
      $title_wk  = $tweet;
      if ($tweet =~ m/^$TAG (.*)/) {
        $title_wk = $1;
      }
      $title  = substr($title_wk, 0, $TITLE_LEN);

      print STDOUT "$usr\t$status\t$len\t$title\t$tweet\n";
    } else {
      print STDOUT "$ERR_ILL_FORMAT\n";
    }
  }
}

#
# HTML特殊文字の文字実態参照を元に戻す。
#
sub SgCmHtmlCerToOrg {
  my $str = shift;
  my $i;

  for ($i = 0; $i < @ARY_HTML_CER; $i++) {
    $str =~ s/$ARY_HTML_CER[$i]/$ARY_HTML_CER_ORG[$i]/g;
  }

  return $str;
}


■備考
twnovelオフ会で回覧した分析資料や「All of twnovel 0001」は、このデータから製作しています。
・「Twitterの特定ハッシュタグの呟きを一括取得する」で取得したデータの一次加工方法を示しています。