見出し画像

pandasライブラリを使ってcsvからsqlを生成する その3

今回はヘッダー箇所の処理を行う。データーテーブルでいえば、カラム名の取り出しに相当する。
csvファイルの一行目が、これに相当する。(赤枠内)

test.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のほうが間違っていた。
この程度なら、ベテランもよくやるチョンボである。だれにも言わないで、黙って修正しておくことにする。

つづく


いいなと思ったら応援しよう!