スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

区分値を管理するシートからINSERT文作成

区分値を管理するOpenOffice CalcのシートからテーブルへinsertするSQLを自動生成するgroovyのプログラムを紹介します。
まずシートの構造です。kbn.odsに保存されているとします。

区分分類名 区分分類コード 区分明細コード 区分明細名
性別 001 01 男
性別 001 02 女
都道府県 002 01 北海道
都道府県 002 02 青森

次に登録するテーブルです。

CREATE TABLE t_kbn (
kbn_code TEXT NOT NULL
,kbn_type_code TEXT NOT NULL
,kbn_detail_code TEXT NOT NULL
,kbn_detail_name TEXT NOT NULL DEFAULT ''
,bk TEXT NULL
,PRIMARY KEY(kbn_code)
);

区分分類名は登録しません。kbn_codeは区分分類コードと区分明細コードを結合したものを登録します。
では、本命のgroovyのプログラムです。
外部ライブラリとしてJXPathを利用しています。

import java.util.zip.*
import javax.xml.parsers.*
import org.apache.commons.jxpath.*
import org.w3c.dom.*

// ZIPファイルの指定
def zipFile = new ZipFile("kbn.ods");
def zipEntry = zipFile.getEntry("content.xml");

// ZIPの中身のXML読み込み
def factory = DocumentBuilderFactory.newInstance();
def builder = factory.newDocumentBuilder();
def document = builder.parse(zipFile.getInputStream(zipEntry));

// XML解析
def context = JXPathContext.newContext(document);
def sheet = context.selectSingleNode(
"/office:document-content/office:body/office:spreadsheet/table:table[@table:name='Sheet1']");
context = JXPathContext.newContext(sheet);
def rowList = context.selectNodes("table:table-row");
def lineList = []
for (Object row : rowList) {
def line = []
context = JXPathContext.newContext(row);
def colList = context.selectNodes("table:table-cell");
for (def col : colList) {
context = JXPathContext.newContext(col);
try {
def value = context.getValue("text:p");
line << value
} catch (JXPathNotFoundException e) {
}

}
if (line.size() != 0) {
lineList << line
}
}

// SQL生成
lineList.remove(0)
print "INSERT INTO t_kbn (kbn_code, kbn_type_code, kbn_detail_code, kbn_detail_name) VALUES \n"
def first = true
for (def line : lineList) {
print " ";
if (first) {
first = false;
print " "
} else {
print ","
}
print "('" + line[1] + line[2] + "', '" + line[1] + "', '" + line[2] + "', '" + line[3] + "')\n"
}
print ";\n"

実行結果は以下の通りです。

INSERT INTO t_kbn (kbn_code, kbn_type_code, kbn_detail_code, kbn_detail_name) VALUES
('00101', '001', '01', '男')
,('00102', '001', '02', '女')
,('00201', '002', '01', '北海道')
,('00202', '002', '02', '青森')
;
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。