2

列名を抽出したい非常に大きくて厄介なクエリのセットがあります。それらはすべて次の形式になります。<table>.<column>

私は正規表現に不慣れで、パターンマッチがどこで失敗しているのかわからないようで、何も返されません。

# Read file in and parse out all column names, they must be of the
# form <table>.<column> 
$data_file="C:\\VW_DEP_MTHLY_PROJTD_UNPROJTD_STK_FACT.sql";
open SQL_FILE, $data_file or die "Could not open file: $data_file";

while (<SQL_FILE>) {
    if((/ \w+\.\w+/)) {
        print $1;
    }
}

close SQL_FILE;

次のようなクエリの一部を想像できます。

    SELECT PHARMACY_FACT.REC_TYP_ID,
         PHARMACY_FACT.PACK_ID,
         ("VARCHAR"(DATE_PART('YEAR'::"VARCHAR", ASSET.MTHLY_CYC_END_DT)) || LPAD("VARCHAR"(ASSET.IMS_CYC_WK_NBR), 2, '0'::"VARCHAR")) AS IMS_CYC_WK_NBR,
         ASSET.WKLY_CYC_END_DT,
         PHARMACY_FACT.TAX_PCT_RT,
         CASE WHEN ((CASE WHEN (PHARMACY_FACT.INDIR_PUR_AMT NOTNULL) THEN PHARMACY_FACT.INDIR_PUR_AMT WHEN (0 NOTNULL) THEN '0'::"NUMERIC"
    ELSE NULL::"NUMERIC"
    END + CASE WHEN (PHARMACY_FACT.DIR_PUR_AMT NOTNULL) THEN PHARMACY_FACT.DIR_PUR_AMT WHEN (0 NOTNULL) THEN '0'::"NUMERIC"
    ELSE NULL::"NUMERIC"
    END) <> '0'::"NUMERIC") THEN (CASE WHEN (PHARMACY_FACT.INDIR_PUR_AMT NOTNULL) THEN PHARMACY_FACT.INDIR_PUR_AMT WHEN (0 NOTNULL) THEN '0'::"NUMERIC"
    ELSE NULL::"NUMERIC"
    END + CASE WHEN (PHARMACY_FACT.DIR_PUR_AMT NOTNULL) THEN PHARMACY_FACT.DIR_PUR_AMT WHEN (0 NOTNULL) THEN '0'::"NUMERIC"
    ELSE NULL::"NUMERIC"
    END)
    ELSE NULL::"NUMERIC"
    END AS UNPRJ_TOT_PUR_AMT
    ...
4

3 に答える 3

0

括弧を使用してグループ内の列名をキャプチャし、各行内のすべての列でループする必要があります。

while (<SQL_FILE>) {
    while(/(\w+\.\w+)/g) {
        print $1,"\n";
    }
}
于 2013-03-22T14:09:44.533 に答える
0

あなたのコードは、各行の最初の列名のみを見つけます。各行をスペースで分割し、プリミティブを解析できます

use strict;

my $data_file='/tmp/sosql';
open my $sql_file, $data_file or die "Could not open file: $data_file";

while (my $line = <$sql_file>) {
    foreach my $word (split(/\s/,$line)) {
        if ($word =~ /(\w+\.\w+)/) {
            print $1."\n";
        }
    }
}

close $sql_file;
于 2013-03-22T13:46:50.353 に答える
0

$1 を設定するには、正規表現の一部を括弧で囲んで「キャプチャ」する必要があります。

while (<SQL_FILE>) {
    if (/ (\w+\.\w+)/) {
        print $1;
    }
}

マッチ演算子の内側ではなく外側に括弧があったようです。

于 2012-12-03T15:37:14.257 に答える