当前位置: 首页 > 面试题库 >

如何从原始SQL文件中清除注释

梅飞龙
2023-03-14
问题内容

我在清理注释和已存在的sql文件中的空行时遇到问题。该文件有1万多行,因此无法手动清洁。

我有一些python脚本,但是我不知道如何处理多行插入内容中的注释。

代码:

f = file( 'file.sql', 'r' )
t = filter( lambda x: not x.startswith('--') \
            and not x.isspace() 
  , f.readlines() )
f.close()
t #<- here the cleaned data should be

它应该如何工作:

这应该清洗:

-- normal sql comment

这应该保持原样:

CREATE FUNCTION func1(a integer) RETURNS void
    LANGUAGE plpgsql
    AS $$
BEGIN
        -- comment
       [...]
END;
$$;

INSERT INTO public.texts (multilinetext) VALUES ('
and more lines here \'
-- part of text 
\'
[...]

');

问题答案:

尝试使用sqlparse模块。

更新的示例: 将注释保留在插入值内,并将注释保留在CREATE FUNCTION块内 。您可以进一步调整以调整行为:

import sqlparse
from sqlparse import tokens

queries = '''
CREATE FUNCTION func1(a integer) RETURNS void
    LANGUAGE plpgsql
        AS $$
        BEGIN
                -- comment
       END;
       $$;
SELECT -- comment
* FROM -- comment
TABLE foo;
-- comment
INSERT INTO foo VALUES ('a -- foo bar');
INSERT INTO foo
VALUES ('
a 
-- foo bar'
);

'''

IGNORE = set(['CREATE FUNCTION',])  # extend this

def _filter(stmt, allow=0):
    ddl = [t for t in stmt.tokens if t.ttype in (tokens.DDL, tokens.Keyword)]
    start = ' '.join(d.value for d in ddl[:2])
    if ddl and start in IGNORE:
        allow = 1
    for tok in stmt.tokens:
        if allow or not isinstance(tok, sqlparse.sql.Comment):
            yield tok

for stmt in sqlparse.split(queries):
    sql = sqlparse.parse(stmt)[0]
    print sqlparse.sql.TokenList([t for t in _filter(sql)])

输出:

CREATE FUNCTION func1(a integer) RETURNS void
    LANGUAGE plpgsql
        AS $$
        BEGIN
                -- comment
       END;
       $$;

SELECT * FROM TABLE foo;

INSERT INTO foo VALUES ('a -- foo bar');

INSERT INTO foo
VALUES ('
a
-- foo bar'
);


 类似资料:
  • 我从JSON文件中获取文本字段并将它们放入MySQL数据库。例如,SQL不关心表情符号代码\xF0\x9F\x98\x81。当尝试将此数据插入行时,它会显示“不正确的字符串值”。 我在这里有点不知所云,但我认为这是表情符号的UTF-8代码,在这里是笑脸。 我正在使用一个基于java的ETL客户端(Pentaho的Spoon)获取JSON数据并将其传递给MySQL数据库。 问题是,我不知道如何编写代

  • 问题内容: 我正在尝试从文件夹中包含在项目中的原始文件获取。但是无论如何,我都会得到一个。 该文件是一个文件,也尝试过使用,也不起作用。使用DOES 播放两个文件都可以。 的回报: 我的代码: 错误: 问题答案: 尝试这种方法,用作您的inputStream。沿着这个地方: 返回一个InputStream 编辑:如果您使用上述方法,请删除这些代码 希望这有帮助,祝你好运!^^

  • 我有一些pdf文件,使用pdfbox我已经将它们转换为文本并存储到文本文件中,现在我要从文本文件中删除它们 超链接 我希望按如下方式逐行获取有效文本: 我们提出了一种从纯文本中提取的多词概念词进行本体学习的方法OntoGain。OntoGain遵循一个由不同处理层定义的本体学习过程。在普通术语提取的基础上,通过对提取的概念进行聚类,形成概念层次结构。然后,衍生术语“分类法”将丰富非分类关系。已经研

  • 我在我的网站上有一个kartik的文件上传小部件,比如 我想通过一个外部按钮清除选中的文件。我很累 但它不起作用。如何从kartik文件输入清除所选文件。提前感谢

  • 我能够通过IMAP连接到Gmail并进行解析,但是在电子邮件正文中,我获得了Gmail特定的内容,例如

  • 问题内容: 我将localhost中的MySQL用作在R中执行统计信息的“查询工具”,也就是说,每次运行R脚本时,我都会创建一个新的数据库(A),创建一个新的表(B),然后将数据导入B ,提交查询以获取所需信息,然后删除B并删除A。 对于我来说,它工作正常,但是我意识到ibdata文件的大小正在迅速增加,我没有在MySQL中存储任何内容,但是ibdata1文件已超过100 MB。 我在设置中使用了