我有一个非常庞大且讨厌的查询集,我想从中提取列名称,它们都是格式<table>.<column>
我是regex的新手,似乎无法看到我的模式匹配失败的地方,它不会返回任何内容。
# 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 :(得分:0)
为了设置1美元,您需要通过将其置于括号中来“捕获”正则表达式的某些部分。
while (<SQL_FILE>) {
if (/ (\w+\.\w+)/) {
print $1;
}
}
看起来你在匹配运算符之外而不是在其中的parens。
答案 1 :(得分: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;
答案 2 :(得分:0)
您必须使用括号捕获组中的列名,并在每行中的所有列上循环:
while (<SQL_FILE>) {
while(/(\w+\.\w+)/g) {
print $1,"\n";
}
}