【问题标题】:python/bash SQL for tsv flatfiles (No sqlite)用于 tsv 平面文件的 python/bash SQL(无 sqlite)
【发布时间】:2011-11-21 12:29:25
【问题描述】:

背景:

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?

【问题讨论】:

  • 我不确定 Python,但如果你想加入我们的黑暗面(我们有 cookie!:P),你可以使用 Perl 模块 DBD::CSV (@ 987654321@).
  • @JackManey 永远不会! :) 是的 DBD::CSV 看起来不错,我把它展示给了我的 perl 同事,这样他就可以使用它了。感谢您的提示。
  • 不客气。 :)

标签: python sql bash flat-file tsv


【解决方案1】:

您可以使用csv 模块和list comprehensions 一起破解一些东西:

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 的 functional programming tools 做一些更令人印象深刻的事情,尽管如果您还不熟悉 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]
    

【讨论】:

    【解决方案2】:

    我强烈推荐 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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多