4

背景:

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

问题:

是否有一套不需要 sqlite 并且仅适用于原始制表符间隔文件的 SQL 类型命令/fxns(最好是 python/bash)?例如,不要使用表格来选择行,而只需使用列号。

例子

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

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

4

3 回答 3

2

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]
    
于 2011-09-21T00:00:04.543 回答
1

谷歌搜索后python equivalent of DBD::CSV,我找到了 KirbyBase。这看起来好像符合要求。

但是,由于我通常不使用 Python,因此我从未尝试过。

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

于 2011-09-20T23:45:30.157 回答
0

我强烈推荐 Microsoft 的日志解析器 2.2 ...除了我认为您使用的是 Linux。很确定那是行不通的。但是我会把链接放在这里,以防有人不使用 Linux。

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

于 2011-09-21T00:06:53.850 回答