我们一直在命令行上使用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和