2014/07/07
PostgreSQL > テスト用ダミーファイル群を作る(3)
PostgreSQL > テスト用ダミーファイル群を作る(3)
一昨日、昨日の続き。PostgreSQL の COPY コマンドと DO 構文を使い、ダミーデータファイルを複数一括作成する。その際、ダミーデータをファイル名に応じた内容にする。さらに PL/Python を使ってファイル名に日本語を含める。実行環境は 2014/04/17 を参照。
まず ↓ を参考に PL/Python でファイル名を変えるテスト。一番目の URL にあるとおり、Windows では変更先のファイルが既存だとエラーになる。一方ファイルコピーの場合は既存でも上書されエラーにならない。そこで「コピーしてから元ファイルを消す」ことにした。
■ Python コード研究所 : ファイル名を変更する os.rename
http://pythoncode.blog.fc2.com/blog-entry-130.html
■ GeSource : Python Tips : ファイルをコピーする
http://www.gesource.jp/programming/python/code/0015.html
↓ テストの内容。二つのモジュール os と shutil のロードが必要。
↓ テスト結果。パスに半角空白があっても問題なく、日本語を含むファイル名に変更できた。
次に COPY コマンドと DO 構文で、とりあえず ASCII だけのファイル名にダミーデータを出力するクエリを作る。一昨日と同じ二つのテーブル ↓ を使う。一番目が全国47都道府県のコード・名称の一覧。二番目が全国854市(現存しないのも含む)のコード・名称の一覧。ファイルを都道県別の47個とし、県内各市のダミーデータを入力する。
↓ 作成したクエリ。基本的な流れは昨日までと同じ。外側のループで都道府県別のファイル名を準備し、内側のループでダミーデータをクエリし COPY コマンドで出力する。この時、都道府県ごとの市のリストを取得する。どの市も10行ずつ発生させた。
↑ 実行結果。メッセージペインにファイル名とクエリが出ている。下は結果のフォルダとファイル内容。指定した文字コード EUC-JP のとおり。参考までファイル群の ZIP も置いておく。
https://kenpg.up.seesaa.net/image/20140707_test_1.zip
上のクエリに、冒頭でテストしたファイル名を変更する PL/Python を足せばよい。↓ が作成したクエリ。PL/Python の DO 文をまるごと変数に入れ EXECUTE で実行する。
↑ 実行結果。無事に日本語を含むファイル名に変更できた。下は結果のフォルダとファイル内容。参考までファイル群の ZIP も置いておく。
https://kenpg.up.seesaa.net/image/20140707_test_2.zip
これでダミーデータファイルの複数一括作成の件は一区切り。出力先へ PostgreSQL ユーザの書き込み権限を設定する手間はあるが、pgAdmin のクエリツール上で、日本語ファイル名を含めてかなり自由に作成する環境ができた。
まず ↓ を参考に PL/Python でファイル名を変えるテスト。一番目の URL にあるとおり、Windows では変更先のファイルが既存だとエラーになる。一方ファイルコピーの場合は既存でも上書されエラーにならない。そこで「コピーしてから元ファイルを消す」ことにした。
■ Python コード研究所 : ファイル名を変更する os.rename
http://pythoncode.blog.fc2.com/blog-entry-130.html
■ GeSource : Python Tips : ファイルをコピーする
http://www.gesource.jp/programming/python/code/0015.html
↓ テストの内容。二つのモジュール os と shutil のロードが必要。
DO LANGUAGE plpython3u $PY$
import os, shutil
fn1 = 'R:/Test 20140707 0/test desu.txt'
fn2 = 'R:/Test 20140707 0/テストです.txt'
shutil.copyfile(fn1, fn2)
os.remove(fn1) ;
$PY$ ;
↓ テスト結果。パスに半角空白があっても問題なく、日本語を含むファイル名に変更できた。
次に COPY コマンドと DO 構文で、とりあえず ASCII だけのファイル名にダミーデータを出力するクエリを作る。一昨日と同じ二つのテーブル ↓ を使う。一番目が全国47都道府県のコード・名称の一覧。二番目が全国854市(現存しないのも含む)のコード・名称の一覧。ファイルを都道県別の47個とし、県内各市のダミーデータを入力する。
↓ 作成したクエリ。基本的な流れは昨日までと同じ。外側のループで都道府県別のファイル名を準備し、内側のループでダミーデータをクエリし COPY コマンドで出力する。この時、都道府県ごとの市のリストを取得する。どの市も10行ずつ発生させた。
DO $D$
DECLARE r record ;
dir text = 'R:/Test 20140707 1/' ; -- 出力先フォルダ
enc text = 'EUC-JP' ; -- 出力ファイル文字コード
ext text = 'tsv' ; -- 出力ファイル拡張子
fmt text = 'text' ; -- 出力フォーマット
fn1 text ;
sql text ;
BEGIN
FOR r IN
SELECT * FROM "201407"."05_tb_sample_1"
LOOP
fn1 = concat(dir, r.pcode, '.', ext) ;
sql = format('COPY (
SELECT text %L
, text %L
, text %L
, text %L
UNION ALL
SELECT jcode
, jname
, sub :: text
, random() :: text
FROM "201407"."05_tb_sample_2"
, generate_series(1, 10) sub
WHERE jcode LIKE %L
) TO %L (ENCODING %L, FORMAT %L)'
, 'jcode'
, 'jname'
, 'subid'
, 'val'
, r.pcode || '%'
, fn1
, enc
, fmt) ;
RAISE INFO '% : %', fn1, sql ;
EXECUTE sql ;
END LOOP ;
END $D$ ;
↑ 実行結果。メッセージペインにファイル名とクエリが出ている。下は結果のフォルダとファイル内容。指定した文字コード EUC-JP のとおり。参考までファイル群の ZIP も置いておく。
https://kenpg.up.seesaa.net/image/20140707_test_1.zip
上のクエリに、冒頭でテストしたファイル名を変更する PL/Python を足せばよい。↓ が作成したクエリ。PL/Python の DO 文をまるごと変数に入れ EXECUTE で実行する。
DO $D$
DECLARE r record ;
dir text = 'R:/Test 20140707 2/' ;
enc text = 'SJIS' ; -- 変えてみた
ext text = 'csv' ; -- 変えてみた
fmt text = 'csv' ; -- 変えてみた
fn1 text ;
fn2 text ; -- 追加
sql text ;
BEGIN
FOR r IN
SELECT * FROM "201407"."05_tb_sample_1"
LOOP
fn1 = concat(dir, r.pcode, '.', ext) ;
fn2 = concat(dir, r.pcode, ' ', r.pname, '.', ext) ;
sql = format('COPY (
SELECT text %L
, text %L
, text %L
, text %L
UNION ALL
SELECT jcode
, jname
, sub :: text
, random() :: text
FROM "201407"."05_tb_sample_2"
, generate_series(1, 10) sub
WHERE jcode LIKE %L
) TO %L (ENCODING %L, FORMAT %L)'
, 'jcode'
, 'jname'
, 'subid'
, 'val'
, r.pcode || '%'
, fn1
, enc
, fmt) ;
EXECUTE sql ;
-- ファイル名変更(コピー&元削除)
sql = format('DO LANGUAGE plpython3u $PY$
import os, shutil
shutil.copyfile(%L, %L)
os.remove(%L) ;
$PY$', fn1, fn2, fn1) ;
EXECUTE sql ;
RAISE INFO '%', sql ;
END LOOP ;
END $D$ ;
↑ 実行結果。無事に日本語を含むファイル名に変更できた。下は結果のフォルダとファイル内容。参考までファイル群の ZIP も置いておく。
https://kenpg.up.seesaa.net/image/20140707_test_2.zip
これでダミーデータファイルの複数一括作成の件は一区切り。出力先へ PostgreSQL ユーザの書き込み権限を設定する手間はあるが、pgAdmin のクエリツール上で、日本語ファイル名を含めてかなり自由に作成する環境ができた。