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

用于Linux上文本文件的SQL查询引擎?

仲绍晖
2023-03-14
问题内容

我们一直在命令行上使用grep,cut,sort,uniq和join进行数据分析。它们有很多缺点,但效果很好。例如,您必须为每个工具提供列号。我们通常有宽文件(许多列)和提供列名称的​​列标题。实际上,我们的文件看起来很像SQL表。我确定有一个驱动程序(ODBC?)可以在定界的文本文件上运行,并且有一些查询引擎可以使用该驱动程序,因此我们可以在文本文件上使用SQL查询。由于分析通常是临时性的,因此必须最少的设置来查询新文件(仅使用我在此目录中指定的文件),而不是在某些配置中声明特定的表。

实际上,最简单的是什么?也就是说,最容易设置并用于文本文件的SQL引擎和驱动程序吗?


问题答案:

拒绝别人的建议,这是sqlite3的Python脚本。有点冗长,但是有效。

我不想完全复制文件以删除标题行,但是我不知道如何说服sqlite3的.import跳过它。我可以创建INSERT语句,但这似乎同样糟糕,甚至更糟。

样本调用:

$ sql.py --file foo --sql "select count(*) from data"

代码:

#!/usr/bin/env python

"""Run a SQL statement on a text file"""

import os
import sys
import getopt
import tempfile
import re

class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def runCmd(cmd):
    if os.system(cmd):
        print "Error running " + cmd
        sys.exit(1)
        # TODO(dan): Return actual exit code

def usage():
    print >>sys.stderr, "Usage: sql.py --file file --sql sql"

def main(argv=None):
    if argv is None:
        argv = sys.argv

    try:
        try:
            opts, args = getopt.getopt(argv[1:], "h",
                                       ["help", "file=", "sql="])
        except getopt.error, msg:
            raise Usage(msg)
    except Usage, err:
        print >>sys.stderr, err.msg
        print >>sys.stderr, "for help use --help"
        return 2

    filename = None
    sql = None
    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            return 0
        elif o in ("--file"):
            filename = a
        elif o in ("--sql"):
            sql = a
        else:
            print "Found unexpected option " + o

    if not filename:
        print >>sys.stderr, "Must give --file"
        sys.exit(1)
    if not sql:
        print >>sys.stderr, "Must give --sql"
        sys.exit(1)

    # Get the first line of the file to make a CREATE statement
    #
    # Copy the rest of the lines into a new file (datafile) so that
    # sqlite3 can import data without header.  If sqlite3 could skip
    # the first line with .import, this copy would be unnecessary.
    foo = open(filename)
    datafile = tempfile.NamedTemporaryFile()
    first = True
    for line in foo.readlines():
        if first:
            headers = line.rstrip().split()
            first = False
        else:
            print >>datafile, line,
    datafile.flush()
    #print datafile.name
    #runCmd("cat %s" % datafile.name)
    # Create columns with NUMERIC affinity so that if they are numbers,
    # SQL queries will treat them as such.
    create_statement = "CREATE TABLE data (" + ",".join(
        map(lambda x: "`%s` NUMERIC" % x, headers)) + ");"

    cmdfile = tempfile.NamedTemporaryFile()
    #print cmdfile.name
    print >>cmdfile,create_statement
    print >>cmdfile,".separator ' '"
    print >>cmdfile,".import '" + datafile.name + "' data"
    print >>cmdfile, sql + ";"
    cmdfile.flush()
    #runCmd("cat %s" % cmdfile.name)
    runCmd("cat %s | sqlite3" % cmdfile.name)

if __name__ == "__main__":
    sys.exit(main())


 类似资料:
  • 我有一个. sql文件,其中包含各种SQL查询,我运行测试和调试应用程序。当我将应用程序加载到Intellij理念(12)中时,它要求我使用SQL方言(在本例中是Oracle),并坚持运行整个脚本。 我只想通过点击在文件中运行一个特定的SQL查询 我很确定我曾经在第11节中这样做过。这还可能吗?谢谢

  • 我在Mariadb有大量的数据。我需要从查询创建转储文件。到目前为止我有这样的东西。

  • 问题内容: 我调试了存储过程(SQL Server 2005),需要在数据表中找出一些值。 该过程由应用程序的事件运行,而我仅观察调试输出。 我执行以下存储过程(SQL Server 2005),以系统表(master.dbo.spt_values)为例: 因此,当我取消注释第二行(如一切正常)时,文件在C:\驱动器上分配……但是如果我将其注释为仅剩下第一行,则将生成任何输出。 如何解决这个问题?

  • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我试图找到一种方法来扫描我的整个Linux系统,以查找包含特定文本字符串的所有文件。只是为了澄清,我正在文件中寻找文本,而不是在文件名中寻找文本。 当我查找如何执行此操作时,我两次遇到此解决方案: 但是,它不起作用。似乎显示了系统中的每个文件。 这接近正确的方法吗?如果没

  • 问题内容: 经过Google的几次搜索后,我想到的是: 这非常不方便,并且会输出不需要的文本,例如mime类型信息。有更好的解决方案吗?我在同一文件夹中有很多图像和其他二进制文件,还有很多文本文件需要搜索。 问题答案: 我知道这是一个旧线程,但是我偶然发现了它,并认为我会分享我的方法,我发现这是一种非常快速的方法,可用于仅查找非二进制文件: grep 的选项告诉它立即忽略二进制文件,而连同的选项会

  • 问题内容: 我想使用原始sql来计算帐户余额,而无需额外的应用程序逻辑。交易模式包括金额,from_account_id和to_account_id 我的查询是 而且它没有按我预期的那样工作-结果是错误的,但是如果我仅在事务正常运行后才加入交易,例如只需借记金额就可以 我在余额查询中错过了什么? http://sqlfiddle.com/#!15/b5565/1 问题答案: 基本上,您正在计算a和