Instantly share code, notes, and snippets.

Embed
What would you like to do?
csvファイルをsqliteに登録

csvファイルの内容を手軽にsqliteに登録するだけのサンプル

やりたいこと

sqlite3のDBを作成し、csv/tsvファイルの内容をsqlite3のtableとして格納する汎用スニペット?です。

簡易的にcsvファイルをdb化してパパッと操作したいときに使うことを想定しています。

環境

  • python3
  • sqlite3

前提/制約

  • ヘッダー付のcsv/tsvファイルを想定しています(ヘッダーがそのままカラム名になります。)
  • 日本語を含む場合はutf-8で。
  • 型チェックやプライマリーキー設定はしません。全部TEXTとして放り込みます。

使い方

スクリプトをcsv2sqlite.pyとして保存し、コマンドラインから引数を与えて実行します。

  • args[1] : 必須 : インプットとなるcsv/tsvファイルのパス
  • args[2] : 必須 : 対象のDBファイルのパス、存在しなければ新規作成
  • args[3] : 必須 : 対象のテーブル名、存在しなければ新規作成、存在すれば一度トランケートしてからインサートします(注意)
  • args[4] : 任意 : "csv"か"tsv"を指定。何もなければcsvとして処理します

例:python csv2sqlite.py data/input.tsv newdb.db main tsv

# coding: utf-8
# [sample]
# python csv2sqlite.py path/input.csv db_name.sqlite3 table_name [file_type]
#
import sqlite3
import sys
args = sys.argv
if len(args) < 4 :
sys.exit(1)
input_file = args[1]
db_name = args[2]
table_name = args[3]
sep_tag = "\t" if (len(args) == 5) and args[4] == "tsv" else ","
#function
def insertData(data,table_name,cursor):
if 0 < len(data):
sql = "INSERT INTO " + table_name + " VALUES (" + ",".join(list("?" * len(data[1]))) + ");"
cursor.executemany(sql, data)
# db open
conn = sqlite3.connect(args[2])
c = conn.cursor()
# input file open
with open(args[1],"r",encoding='utf-8') as f:
# Make header
line = f.readline()
header = line.replace('\n','').replace('\r','').split(sep_tag)
header = list(map(lambda s: s+" text", header))
header = ",".join(header)
# Create table
sql = "CREATE TABLE IF NOT EXISTS " + table_name + "(" + header + ");"
c.execute(sql)
# Truncate table
sql = "DELETE FROM " + table_name + ";"
c.execute(sql)
# Insert data
data_count = 0
DATA_SPLIT = 100000
data = []
for line in f:
data.append(line.replace('\n','').replace('\r','').split(sep_tag))
data_count += 1
if len(data) % DATA_SPLIT == 0:
insertData(data,table_name,c)
data = []
insertData(data,table_name,c)
f.close()
conn.commit()
conn.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment