pandasライブラリを使ってcsvからsqlを生成する その4
前回は、INSERT構文の前半部分である、カラムを規定する下記の文字列を生成する箇所について説明を行った。
INSERT INTO table(volume, part, chapter, section, step, text) values (
今回はこれに続いて、入力するデーターそのもの生成を行うことにする。
## sqlの前方部分に実際に入力するカラムの内容を結合して
## 一塊の文字列(files)にする
def sqlf(csvfile,table):
sqlS = sqlSf(csvfile,table)
array = pd.read_csv(csvfile).values.tolist()
files = ""
for tmp in array:
sqlE = ""
n = 0
for dat in tmp:
if n == 0:
sqlE += "'" + str(dat) + "'"
else:
sqlE += ", " + "'" + str(dat) + "'"
n += 1
sql = sqlS + sqlE + ");"
files += sql + "\n"
return files
下記に観えるvalues.tolist()が、csvファイルからヘッダ箇所を除外した複数行を、2元配列に変換するものとなっている。
array = pd.read_csv(csvfile).values.tolist()
これさえ取得できれば、この配列から必要なものを取り出してINSERT文の後半を生成していくだけだ。カラムの箇所が一元配列だったが、今回は2元配列なのが、異っているだけでしかない。だから基本的な方法はカラムの箇所を同じだが、ループが二重になっている。
最初にとりだしたものを、テンポラリー配列(tmp)として、そこからさらにデータをdatとして取り出している。
注意しなければならないのは、カラムは文字列のみだったが、データには整数や実数などの数値もあるということだ。sqlを文字列として生成するため下記のdatが文字列でないと、ここでプログラムはエラーで停止してしまう。
sqlE += "'" + dat + "'"
上記のプログラムでは次のようにstr関数を用いて文字列の結合を行たのは、このエラーを回避するのが目的だった。
sqlE += "'" + str(dat) + "'"
nでカウントしているのは、前回と同様にカンマ(,)の数をカラムの数より一つ少なくするためだけに過ぎない。
今回はプログラムの起動時にコマンドラインからの入力を読む機能を、下記のように追加した。
## コマンドラインからcsvファイル名とテーブル名
if len(sys.argv) > 2:
args = sys.argv
# csvファイル名とテーブル名の指定
csvFile = args[1]
tableName = args[2]
main(csvFile,tableName)
else:
print("下記のように入力してください。")
print("py csvsql,py csvファイル名 テーブル名")
sys.exit()
時間も無くなったから、記述を一旦終えることにする。
蛇足かもしれないが、コマンドライン入力を行うためには、sysをインポートしておかなければならないことを、注意しておく。