1

私は2つのファイルを持っています。1 つはデータベースからダンプされたテーブル作成文字列のファイルで、もう 1 つはテーブルの名前で、接頭辞として「prompt」、接尾辞として「...」が付いています。以下のように:ファイルA(インデックス):

prompt branch...
prompt branch_param...
prompt branch_pre_param...
prompt business...
prompt business_map...
prompt business_type...

ファイル B (ダンプ):

CREATE TABLE "KS"."BRANCH"
 ("BRANCH_CODE"       CHARACTER(3)    NOT NULL  DEFAULT '',
  "BRANCH_NAME"       CHARACTER(40)   NOT NULL  DEFAULT '',
  "PARAM_LEVEL"       INTEGER         NOT NULL  DEFAULT 0
 )
  DATA CAPTURE NONE
 IN "LONG_DATA_TBS";


CREATE TABLE "KS"."BRANCH2BANK"
 ("BRANCH_CODE"         CHARACTER(3)    NOT NULL  DEFAULT '',
  "BANK_CODE"           CHARACTER(6)    NOT NULL  DEFAULT '',
  "ACC_COMP_RESULT"     CHARACTER(1)    NOT NULL  DEFAULT ''
 )
  DATA CAPTURE NONE
 IN "SMALL_TBS";

CREATE TABLE "KS"."BRANCH2BOND"
 ("BRANCH_CODE"        CHARACTER(3)    NOT NULL  DEFAULT '',
  "BOND_CODE"          CHARACTER(8)    NOT NULL  DEFAULT '',
  "BOND_NAME"          CHARACTER(20)   NOT NULL  DEFAULT '',
  "TOTAL_AMT"          DECIMAL(19, 4)  NOT NULL  DEFAULT 0,
  "FINANCING_CUST_NO"  CHARACTER(10)   NOT NULL  DEFAULT '',
  "SET_DATE"           CHARACTER(8)    NOT NULL  DEFAULT '',
  "SET_TIME"           CHARACTER(8)    NOT NULL  DEFAULT '',
  "SET_EMP"            CHARACTER(6)    NOT NULL  DEFAULT '',
  "SPARE1"             CHARACTER(20)   NOT NULL  DEFAULT '',
  "SPARE2"             CHARACTER(20)   NOT NULL  DEFAULT ''
 )
  DATA CAPTURE NONE
 IN "SMALL_TBS";

CREATE TABLE "KS"."BRANCH_PARAM"
 ("BRANCH_CODE"    CHARACTER(3)    NOT NULL  DEFAULT '',
  "PARAM_CODE"     CHARACTER(4)    NOT NULL  DEFAULT '',
  "SET_DATE"       CHARACTER(8)    NOT NULL  DEFAULT '',
  "SET_TIME"       CHARACTER(8)    NOT NULL  DEFAULT ''
 )
  DATA CAPTURE NONE
 IN "SMALL_TBS";

CREATE TABLE "KS"."BRANCH_RESERVE_CREDIT_STOCK"
 ("BRANCH_CODE"  CHARACTER(3)    NOT NULL  DEFAULT '',
  "SET_TIME"     CHARACTER(8)    NOT NULL  DEFAULT ''
 )
  DATA CAPTURE NONE
 IN "TX_DATA_TBS"
 INDEX IN "TX_INDEX_TBS";

私は perl の実装を書きましたが、あまりにも醜く非効率的だと思います。これを改善するより良い方法はありますか?

私のコード:(リチャードとlilydjwgのアドバイスで書き直されました)(最終バージョン)

#!/usr/bin/perl
use 5.016;

my (%hash,$cont);
open IN,'<',shift;
while(<IN>){
    chomp;
    $hash{$1}=1 if /prompt (\w+)\.\.\./;
}
close IN;
open IN,'<',shift;
while(<IN>){
    chomp;
    $cont = (defined $hash{lc $1}?say "prompt $1..." : 0) if /CREATE TABLE "KS"\."(\w+)"/;
    say if $cont == 1;
}
close IN;                   
4

2 に答える 2

1

おそらく、それはあなたが好きではない繰り返しの読み取りです。

そのため、CREATE TABLE ファイルを 1 回読み取り、以下を確認します。

CREATE TABLE "KS"."(\w+)"

次に、次の CREATE TABLE までテーブル定義を構築できます。その時点で、テーブル定義をテーブル名でキー付けされたハッシュに入れます。

次に、プロンプトを読み、それらを出力するハッシュから定義を 1 つずつ取得します。

または、 CREATE TABLE ファイルを単一の文字列に読み取り、テーブル名の部分を検索して置換することもできます。これは、現時点で変更しているように見えるだけです。ただし、最初のアプローチはより柔軟です。


編集:おそらく次のようにして、定義されたビットをもう少し明確にすることができます:

while ($line=<IN>) {
    chomp($line);
    if (/CREATE TABLE "KS"\."(\w+)"/ && $hash{lc $1}) {
        $line = ...
    }
    say $line;
}

数行を超えると、while ループで明示的な変数を使用するのが好きです。

于 2012-10-22T09:41:42.870 に答える
0

ファイル A は比較的小さいようです。すべてのテーブル名を含むセット (など) を読み取って構築できます。次に、SQL ダンプ ファイルを読み取って特定し、テーブル作成ステートメントごとに、そのテーブル名がセットに含まれているかどうかを確認します。

Perl についてはよくわかりませんが、次の Python コードが必要なようです。

import sys

tableNames = {x[7:-3] for l in open(sys.argv[1]) if x.startswith('prompt ')}

for l in open(sys.argv[2]):
  if l.startswith('CREATE TABLE "KS"."'):
    name = l.split('"')[4].lower()
    if name in tableNames:
      print("prompt {0}...\nCreate table{0}(".format(name))
  print(l, end='')
于 2012-10-22T14:29:48.483 に答える