pandasライブラリを使ってcsvからsqlを生成する その3
今回はヘッダー箇所の処理を行う。データーテーブルでいえば、カラム名の取り出しに相当する。
csvファイルの一行目が、これに相当する。(赤枠内)
csvファイルの一行目の取得するたに、pandasライブラリの仕様書がないかと探してみたが、今のところ見つかっていない。
そこで、いろんなページを彷徨った結果、それらしきものが観えてきた。だがそれだけでは、断定はできなかった。そこで下記のテストソースを作成して実行してみることした。
import pandas as pd
print("#1")
array = pd.read_csv("test.csv")
header = array.columns
print(header)
print("#2")
array = pd.read_csv("test.csv", header=0)
header = array.columns
print(header)
print("#3")
array = pd.read_csv("test.csv", header=1)
header = array.columns
print(header)
これを実行してみると、下図のようになった。
これから、ヘッダーのみを取り出すには、以下のどちらでもいことになる。
array = pd.read_csv("test.csv")
header = array.columns
array = pd.read_csv("test.csv", header=0)
header = array.columns
下記の場合はcsvの二行目のデータが取れている。
array = pd.read_csv("test.csv", header=1)
header = array.columns
pandasライブラリでは、1,2,3行を、0,1, 2として読んでいくと考えればいいことになる。これは大半のプログラミング言語の常識だから、ここであえて書くことでもなかったが…
今後は、一行目を対象にしていることを明らかにするために、2番目の書き方(header=0が書かれたもの)を採用することにしたい。
この結果、SQL取得の前半部分は下記で得られることになる。
import pandas as pd
## sqlの前方部分を作成
def sqlSf(csvfile,table):
array = pd.read_csv(csvfile, header=0)
header = array.columns
n = 0
sql = "INSERT INTO " + table + "("
for clmn in header:
if n == 0:
sql += clmn
else:
sql += ", " + clmn
n += 1
sql += ") values ("
return sql
pythonのforループは、他の言語のforeachだと思えばいい。
対象の配列の大きさなどを指定しなくても、勝手に終わりまで廻してくれる。これが、プログラミング初心者がpythonを好きになる要因に違いない。
上記までの結果から、以下の文字列が得られることにになる。
INSERT INTO table(volume, part, chapter, section, step, text) values (
注記:
カラム数より、カンマ(,)が一つ少ない。SQLとしては当たり前だが、プログラムコードにする場合は注意を要する点である。
このために上記のコードでは、nでカウントし、nが0以外の時にカラム名の頭にカンマを付加するようにしている。
プログラムコードなかで指定したのは、テーブル名だけで、その他はCSVから取得したことになる。
次回は、後半の部分values以降の生成について書く予定でいる。
追加の笑い話:
実動作で確かめるために、以下の形でテープルを作成してみた。
CREATE TABLE `tabke` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`volume` INT(11) NOT NULL DEFAULT '0',
`part` INT(11) NOT NULL DEFAULT '0',
`chapter` INT(11) NOT NULL,
`section` INT(11) NOT NULL,
`step` INT(11) NOT NULL,
`text` VARCHAR(5000) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`update_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `u_index` (`volume`, `part`, `section`, `chapter`, `step`) USING BTREE
)
COLLATE='utf8_general_ci'
;
そして処理を行うと下記エラーが発生した。
SQL エラー (1054): Unknown column 'cahapter' in 'field list'
これはテーブル側にcahapterなるカラムがないというエラーだ。
先のクリエート文を見ればわかるように、たしかにそんなものはない。
chapterはあるけれど。
だが、csvのほうが間違っていた。
この程度なら、ベテランもよくやるチョンボである。だれにも言わないで、黙って修正しておくことにする。