twitterのフォローユーザのリストをpsqlに入れてみる

※実際には、12/5のネタです。

■フォローユーザのCSVがダウンロード出来るらしいので。
 ※フォロワーの一覧は有料のようなのでご注意を。

 手順は以下の通り
 http://sachipps.byeto.jp/archives/216

 ManageFiltter
 http://manageflitter.com/

⇒Debian Lenny+Postgresql8.3

■どんな項目があるか

$ lv -a twitterFollowingBackup2011-12-04.csv | head -1 | sed s/","/"\n"/g | nl | column
     1  UserId               6   Real Name          11   Listed
     2   You Follow          7   Verified           12   Whitelisted
     3   Following Back      8   Followers          13   Inactive
     4   Username            9   Following          14   Talkative
     5   Profile                    10   Tweets             15   Quiet

■3、4で誰がフォローしていないかが分かります

$ lv -a twitterFollowingBackup2011-12-04.csv | \
   awk -F\, '{print $3 "," $4}' | grep ^No | wc -l
43

■WindowsでもLinuxでも開けるようにfirefoxを指定
 ※10ページ毎にタブで開くようにした。

$ lv -a twitterFollowingBackup2011-12-04.csv | \
  awk -F\, '{print $3 "," $4}' | grep ^No | awk -F\, '{print $2}' | \
  for list in `xargs`;do \
    echo "\"http://twitter.com/#/${list}\""; \
  done | awk '{if (NR % 10 == 1) {print "firefox " $1} else {print $1}}' | \
  xargs echo -n | sed s/"firefox"/"\n&"/g > list.bat

■Windows版は以下のように。
 ※パスが通って無い場合は、一行目に自身の環境に合わせて
  「cd {Mozilla Filefox install path}:\」を入れる

$ nkf -s -Lw -c twitter_list.bat > list.bat

■chromeの場合
 ※メモ帳で「firefox」を「chrome」に置換。
  「cd {Google chrome install path}:\」を入れる

■linuxの場合

 一行目に「#!/bin/bash」とでも入れる。
 「whereis firefox」でパスが通っているか、
 そもそもインストールされているか、
 sshならX転送を許可しているか等を確認して
 「chmod +x」で実行件を与えて実行。

■見て納得したなら閉じるw

■postgresqlに入れる

 どんな項目があるかで、列が15で在ることは分かっているので、
 文字数の最大値を求める
 ※結構時間がかかるが、自分で数えるよりは良い。

 【条件】
   列は1から15まで(1行目)
   CSVの一行目にある「列の名前:」を表示する(2行目)
   ファイルを読み込み、awkで該当列のみ表示する(3行目)
   半角スペースや「'」は「_」に変換(エスケープ)する(4行目)
   行をfor文に渡す(5行目)
   行をバイトカウントする(6行目)
   小さい順に数値として並べ替え、一番最後(最大値)を取り出す(7行目)
   16で割って1を足し、小数点以下を切り捨て、16倍する(8行目)
   ※16で割った余りが0でも1を足す

$ for num in `seq 1 15`;do \
    echo -n `head -1 ${filename} | awk -F\, '{print $'${num}' ":" }'`; \
    lv -a ${filename} | awk '{print $'${num}'}' | \
    sed s/" "/"_"/g | sed s/\'/"_"/g | \
    for list in `xargs`;do \
      echo "$list" | wc -c; \
    done | sort -n | tail -1 | \
    awk '{print (int($1/16+1)*16)}'; \
  done
UserId:144
You Follow:64
Following Back:64
Username:64
Profile:48
Real Name:48
Verified:16
Followers:16
Following:16
Tweets:16
Listed:16
Whitelisted:16
Inactive:16
Talkative:16
Quiet:16

■psqlに取り込めるように整形する

$ echo `echo "CREATE TABLE twitterdb(=EOF=";echo 'UserId:144
You Follow:64
Following Back:64
Username:64
Profile:48
Real Name:48
Verified:16
Followers:16
Following:16
Tweets:16
Listed:16
Whitelisted:16
Inactive:16
Talkative:16
Quiet:16' | sed s/" "/"_"/g | \
  sed s/":"/" char("/g | sed s/"\$"/"),=EOF="/g ; \
  echo ");"` | sed s/"=EOF="/"\n"/g > psql_twitter.sql

■最後の行の「,」を削除する

$ cat psql_twitter.sql
CREATE TABLE twitterdb(
 UserId char(144),
 You_Follow char(64),
 Following_Back char(64),
 Username char(64),
 Profile char(48),
 Real_Name char(48),
 Verified char(16),
 Followers char(16),
 Following char(16),
 Tweets char(16),
 Listed char(16),
 Whitelisted char(16),
 Inactive char(16),
 Talkative char(16),
 Quiet char(16)
);

■DBに取り込む

$ psql -f psql_twitter.sql

■取り込みの確認

$ echo "select username from twitterdb" | psql -d postgres
 username
----------
(0 rows)

■CSVを取り込む

$ su root -c 'sudo nkf -w twitterFollowingBackup2011-12-04.csv | \
  sed s/","/"\",\""/g | sed s/"^"/"\""/g | sed s/"\$"/"\""/g > twitterdb.csv'
パスワード:
$ sudo chown postgres:postgres twitterdb.csv

■703件も最後の列に何も無い行がありました。

$ cat /home/labunix/twitterdb.csv | \
   awk -F\, '{print $1 "," $15}' | nl | \
   grep -v "\"Yes\"\|\"No\"" | wc -l
703

■空列も無視して、15列まで強引に作成する

$ awk -F\, '{print $1 "," $2 "," \
     $3 "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "," $10 "," \
     $11 "," $12 "," $13 "," $14 "," $15}' twitterdb.csv > 1.csv

$ echo "COPY twitterdb FROM '/var/lib/postgresql/1.csv' WITH CSV;" | psql
COPY 4111

■見出し行を探す

$ echo "select username from twitterdb where username=' Username'" | psql

■見出し行の削除

$ echo "delete from twitterdb where username=' Username'" | psql
DELETE 1

■シェルの助けを借りないと意外と面倒

$ echo "select username,profile from twitterdb" | psql -A -F, | sed s/"  "//g | head -1
username,profile