sqlite3からは
> .separator "\t" > .import hoge.txt hoge
とすればhoge.txtというTSVファイルからデータをhogeテーブルにインポートできる。
これをshell scriptからやるには
$ sqlite3 -separator $'\t' ./data.db ".import ./hoge.txt hoge"
これでいい。
じゃあPythonからやるにはどうしたらいいのだ?
TSVから読み込むのはあまり例が示されていないが、CSVから読み込むのは何例かあった。csv readerとかいうモジュールでcsvファイルを読み込んで、1行ずつinsertしていくという方法のようだが、このcsv reader はコンマ以外のdelimiterでもいけるらしい。
https://srad.jp/~tuneo/journal/514578/
なので
https://stackoverflow.com/questions/2887878/importing-a-csv-file-into-a-sqlite3-database-table-using-python
import csv, sqlite3 conn = sqlite3.connect("data.db") curs = conn.cursor() curs.execute("CREATE TABLE hoge (id INTEGER PRIMARY KEY, type INTEGER, term TEXT, definition TEXT);") reader = csv.reader(open('hoge.txt', 'r'), delimiter= '\t') for row in reader: to_db = [unicode(row[0], "utf8"), unicode(row[1], "utf8"), unicode(row[2], "utf8")] curs.execute("INSERT INTO hoge (type, term, definition) VALUES (?, ?, ?);", to_db) conn.commit()
これで行けそうな感じ。
sqlalchemyでもなんとかなりそうな気がしてきた。
https://stackoverflow.com/questions/41389330/sqlalchemy-csv-import-into-sqlite
ここを参考にするなら
import csv with open('hoge.txt', 'r') as input: tbl_reader = csv.reader(input, delimiter='\t') for row in tbl_reader: hoge.insert().values(type=row[0], term=row[1], definition=row[2])
これでいけるはず。テストしてみよう。
しかし、300カラム分の定義を書くのは骨が折れそうだなあ。
やってみた。
SyntaxError: more than 255 arguments
pythonは関数の引数が255個までしかつかえないんだと。
やっぱり駄目かな。
データアップロードは置いておいて、インメモリー動作の方をまず進めてみよう。