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

前端之家收集整理的这篇文章主要介绍了Linux上的文本文件的SQL查询引擎?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们一直在命令行使用grep,cut,sort,uniq和join来进行数据分析.虽然有缺点,但它们效果很好.例如,您必须为每个工具提供列号.我们经常有宽文件(很多列)和列标题,它们给出了列名.实际上,我们的文件看起来很像sql表.我确定有一个驱动程序(ODBC?)将操作分隔的文本文件,以及一些将使用该驱动程序的查询引擎,因此我们可以在我们的文本文件上使用SQL查询.由于进行分析通常是临时的,因此查询文件(仅使用我在此目录中指定的文件)而不是在某些配置中声明特定表必须是最小化设置.

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

解决方法

重复其他人的建议,这里是sqlite3的 Python脚本.有点冗长,但它的确有效.

我不喜欢完全复制文件删除标题行,但我不知道如何说服sqlite3的.import跳过它.我可以创建INSERT语句,但是如果不是更糟的话,这看起来也差一点.

示例调用

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

代码

  1. #!/usr/bin/env python
  2.  
  3. """Run a sql statement on a text file"""
  4.  
  5. import os
  6. import sys
  7. import getopt
  8. import tempfile
  9. import re
  10.  
  11. class Usage(Exception):
  12. def __init__(self,msg):
  13. self.msg = msg
  14.  
  15. def runCmd(cmd):
  16. if os.system(cmd):
  17. print "Error running " + cmd
  18. sys.exit(1)
  19. # TODO(dan): Return actual exit code
  20.  
  21. def usage():
  22. print >>sys.stderr,"Usage: sql.py --file file --sql sql"
  23.  
  24. def main(argv=None):
  25. if argv is None:
  26. argv = sys.argv
  27.  
  28. try:
  29. try:
  30. opts,args = getopt.getopt(argv[1:],"h",["help","file=","sql="])
  31. except getopt.error,msg:
  32. raise Usage(msg)
  33. except Usage,err:
  34. print >>sys.stderr,err.msg
  35. print >>sys.stderr,"for help use --help"
  36. return 2
  37.  
  38. filename = None
  39. sql = None
  40. for o,a in opts:
  41. if o in ("-h","--help"):
  42. usage()
  43. return 0
  44. elif o in ("--file"):
  45. filename = a
  46. elif o in ("--sql"):
  47. sql = a
  48. else:
  49. print "Found unexpected option " + o
  50.  
  51. if not filename:
  52. print >>sys.stderr,"Must give --file"
  53. sys.exit(1)
  54. if not sql:
  55. print >>sys.stderr,"Must give --sql"
  56. sys.exit(1)
  57.  
  58. # Get the first line of the file to make a CREATE statement
  59. #
  60. # Copy the rest of the lines into a new file (datafile) so that
  61. # sqlite3 can import data without header. If sqlite3 could skip
  62. # the first line with .import,this copy would be unnecessary.
  63. foo = open(filename)
  64. datafile = tempfile.NamedTemporaryFile()
  65. first = True
  66. for line in foo.readlines():
  67. if first:
  68. headers = line.rstrip().split()
  69. first = False
  70. else:
  71. print >>datafile,line,datafile.flush()
  72. #print datafile.name
  73. #runCmd("cat %s" % datafile.name)
  74. # Create columns with NUMERIC affinity so that if they are numbers,# sql queries will treat them as such.
  75. create_statement = "CREATE TABLE data (" + ",".join(
  76. map(lambda x: "`%s` NUMERIC" % x,headers)) + ");"
  77.  
  78. cmdfile = tempfile.NamedTemporaryFile()
  79. #print cmdfile.name
  80. print >>cmdfile,create_statement
  81. print >>cmdfile,".separator ' '"
  82. print >>cmdfile,".import '" + datafile.name + "' data"
  83. print >>cmdfile,sql + ";"
  84. cmdfile.flush()
  85. #runCmd("cat %s" % cmdfile.name)
  86. runCmd("cat %s | sqlite3" % cmdfile.name)
  87.  
  88. if __name__ == "__main__":
  89. sys.exit(main())

猜你在找的Linux相关文章