livedoorから研究用データセット提供してもらったというエントリを以前書いたのですが、やっと活用し始めました。
とりあえずやってみたのがcsvからSQLiteへのデータ書き出し。157万件もあるので大丈夫かな?と思いましたが、小さいとはいえDBなので投入は出来ました。
# -*- coding: utf-8 -*-
import csv
import sqlite3
DBNAME = "ldclip.db"
def initDB():
conn = sqlite3.connect( DBNAME )
try:
conn.executescript("""CREATE TABLE BOOKMARK(
IDX INTEGER,
ID INTEGER,
URL TEXT,
CREATED TIMESTAMP,
TAGS TEXT,
PRIMARY KEY (IDX)
);""")
except Exception, ex:
conn.commit()
finally:
conn.close()
initDB()
conn = sqlite3.connect( DBNAME )
conn.text_factory = str
filename = "ldclip.csv"
csvfile = open( filename )
for row in csv.reader( csvfile ):
conn.execute("INSERT INTO BOOKMARK( ID, URL, CREATED, TAGS ) VALUES( ?, ?, ?, ? )", ( row[ 0 ], row[ 1 ], row[ 2 ], row[ 3 ] ) )
conn.commit()
csvfile.close()
これでldclip.dbというデータベースファイルを作ってテーブルクリエイトをしてcsvからデータ拾ってinsertしている事になります。
ここで知ったのはSQLiteはinteger型をprimary keyにすればシーケンスになるという事。勝手に採番してくれるidxカラムを作ってみた。あと、
conn.text_factory = str
としないと、
OperationalError: Could not decode to UTF-8 column ’address’ with text
とエラー出力されてinsertしてくれなかった。
で、無事に全件投入できたので見てみようとSQLiteBrowserでおもむろにブラウジングしようとしたら固まったw多分駄目だろうなとおもったけど。。なのでとりあえず入ってるデータを確認するスクリプトを組んでみた。
# -*- coding: utf-8 -*-
import sqlite3
def dump():
DBNAME = "ldclip.db"
conn = sqlite3.connect( DBNAME )
conn.row_factory = sqlite3.Row
cur = conn.cursor()
outFile = open('これはひどい.txt', 'w')
try:
cur.execute("SELECT * FROM BOOKMARK WHERE TAGS like ?", (u"%これはひどい%",))
for row in cur:
outFile.write(
str( row[ "idx" ] ) + "," +
str( row[ "id" ] ) + "," +
str( row[ "url" ] ) + "," +
str( row[ "created" ] ) + "," +
row[ "tags" ].encode("utf-8") + "\n"
)
finally:
cur.close()
outFile.close()
dump()
これはひどいタグを付けたレコードを抽出してcsvで書き出すコード。結構あった。重複するURLもあるだろうけど5000件くらいあった。それはどうでもよくて、カラム名からデータを取りたい場合は以下のようなコードを追加してあげればいいみたい。
conn.row_factory = sqlite3.Row
とすることで、上記のようにカラム名でレコードを扱えるようになるとのこと。
あとは、
row[ "tags" ].encode( "utf-8")
としないと
UnicodeEncodeError: 'ascii' codec can't encode characters in position 52-57: ordinal not in range(128)
というエラーになる。そもそもUTF-8でレコード突っ込んでるし、なにが悪いのかよくわからない。ここらへんの勘所を勉強しようと思う。とりあえずデータベースに入ったので集合値プログラミングを見ながら分析掛けてみる。










