2012-11-30 40 views
2

我有一個非常大的和骯髒的設置從哪個我想提取列名的查詢中提取列名,他們都將是以下格式<table>.<column>試圖從一個SQL查詢

我是新來的正則表達式,似乎無法看到我的模式匹配失敗的地方,它不會返回任何東西。

# 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 
    ... 
+0

我現在就像是這... '#讀取文件並解析出所有列名稱,它們的格式必須是

$ data_file =「C:\\ VW_DEP_MTHLY_PROJTD_UNPROJTD_STK_FACT.sql」; 打開SQL_FILE,$ data_file或死「無法打開文件:$ data_file」; while(){ if((/ |(| \ n \ w + \。\ w + |,|)| \ n /))\t { print $ 1; } } close SQL_FILE;' –

回答

0

爲了$ 1設置的,你需要「捕捉」,將其置於括號中的正則表達式的某些部分。

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

看起來你在匹配運算符的外部,而不是在它內部有parens。

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; 
+0

不能保證空格在正確的位置 - 'SELECT table.col1,table.col2,table.col3' is valid sql ... – RickF

0

你必須使用括號和環路上eacch行中的所有列捕捉到一組列名:

while (<SQL_FILE>) { 
    while(/(\w+\.\w+)/g) { 
     print $1,"\n"; 
    } 
}