【问题标题】:Extracting database table names from XML file从 XML 文件中提取数据库表名
【发布时间】:2020-05-22 09:02:06
【问题描述】:

我正在尝试从 xml 标记内的 sql 查询中提取架构和表名

样本

<head>
<sql> select 1 from owner_a.table1 </sql>
<sql> select 1 from owner_b.table2 , owner_b.table3 where ... </sql>
<sql> select 1 from owner_c.table4 join owner_c.table5 on ... left join owner_c.table 6 on .. </sql>
<head>

您可能会注意到,sql 可能有不同的格式。
- 可能在也可能不在 ANSI
- 可能包含也可能不包含 where 子句

模式和表名也没有特定的模式。

为了从 xml 文件中提取 sql,我使用了 xml_grep。

xlm_grep 'sql' --text_only $file.xml

下一个挑战和我被困的部分是在此输出中获取架构和表名

schema  | table_name
owner_a | table1
owner_b | table2
owner_b | table3
owner_c | table4
owner_c | table5
owner_c | table6

我正在考虑的方法 --
对于非 ansi 查询是
- 获取单词“from”之后直到“where”的字符串
- 使用逗号作为分隔符分割字符串 - 使用“.”再次拆分作为分隔模式和表名的分隔符

用于 ansi 查询
- 获取单词“join”之后的字符串
- 使用“.”分割作为分隔符

这是最有效的方法吗?使用 grep 、 sed 或 awk 是否可行?

【问题讨论】:

  • 如果你能列出所有的可能性并找到一个模式,那么它是可以做到的。挑战在于确保列出所有可能性。至于输出,与数据提取相比,这是微不足道的。
  • 现在这将是所有可能的查询格式。
  • 所以你的计划似乎合乎逻辑。开始实施:)
  • @user2058738,样本输入和样本输出是什么?

标签: bash unix awk sed grep


【解决方案1】:

假设您的 SQL 在表名前后有空格。

试试

grep -o ' [a-z_]*\.[^ ]*' 

演示:

$cat file1.txt 
<head>
<sql> select 1 from owner_a.table1 </sql>
<sql> select 1 from owner_b.table2 , owner_b.table3 where ... </sql>
<sql> select 1 from owner_c.table4 join owner_c.table5 on ... left join owner_c.table 6 on .. </sql>
<head>
$grep -o ' [a-z_]*\.[^ ]*' file1.txt  | tr '.' '|' 
 owner_a|table1
 owner_b|table2
 owner_b|table3
 |||
 owner_c|table4
 owner_c|table5
 |||
 owner_c|table
 ||
$


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多