用于tsv平面文件的python/bash SQL(无sqlite)



背景:

sqlite非常适合对加载到数据库中的数据执行SQL操作,但在我的工作中,很多时候我需要对未加载到数据库的文件执行select、join和where语句,这些文件不一定值得花时间加载/初始化到数据库中。此外,sqlite的随机访问特性通常会使对数据库中每一行执行的操作速度变慢。

问题:

是否有一套SQL类型的命令/fxns(最好是python/bash(不需要sqlite,只处理原始制表符分隔的文件?例如,不使用表来选择行,而只使用列编号。

示例

select col1,col2,col3 from fileName.tsv where col1[int] < 3

注:我意识到很多这可以通过awk、cut、bash-join等来完成;我想知道是否还有更SQL风格的东西?

您可以使用csv模块和列表理解一起破解一些东西:

import csv
reader = csv.reader(open('data.csv', 'r'))
rows = [row for row in reader]
# select * from data where first column < 4
# this won't actually work as-is! see the edit below
[row for row in rows if row[0] < 4]
# select * from data where second column >= third column
[row for row in rows if row[1] >= row[2]]
# select columns 1 and 3 from data where first column is "mykey"
[[row[0], row[2]] for row in rows if row[0] == "mykey"]

你可能可以用Python的函数式编程工具做一些更令人印象深刻的事情,尽管如果你还不熟悉FP,那么仅仅为此学习可能太大了;-(


编辑:更多提示:

  • 如果每个脚本只执行一个"查询",那么可以去掉数据的中间存储(在我的示例中为rows(:

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    result = [row for row in reader if row[0] == "banana"]
    
  • csv阅读器将其所有输出生成为文本,因此,如果您想将一列视为整数,则必须自己处理。例如,如果第二列和第三列是整数,

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [[row[0], int(row[1]), int(row[2])] for row in reader]
    # perform a "select" on rows now
    

    (这意味着我上面的第一个例子实际上不会按原样工作。(如果所有列都是整数,那么您可以调用函数map函数:

    import csv
    reader = csv.reader(open('data.csv', 'r'))
    rows = [map(int, row) for row in reader]
    

在谷歌python equivalent of DBD::CSV后,我找到了KirbyBase。这看起来很合适。

然而,由于我通常不使用Python,我从未尝试过

编辑后添加:好吧,看了一眼文档后,查询命令并不完全是SQL,但它们比使用awk更像SQL。

我强烈推荐Microsoft的日志解析器2.2……除非我认为您使用的是Linux。很肯定这不会奏效。但我会把链接放在这里,以防有人不使用Linux。

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659http://www.codinghorror.com/blog/2005/08/microsoft-logparser.html

最新更新