Python/Bash 用于 TSV 平面文件的 SQL(无 SQLite)

4 投票
3 回答
875 浏览
提问于 2025-04-17 02:44

背景:

sqlite非常适合对已经加载到数据库中的数据进行SQL操作,但在我的工作中,很多时候我需要对那些没有加载到数据库中的文件进行选择、连接和条件查询,这样的文件不一定值得花时间去加载到数据库中。此外,sqlite的随机访问特性常常使得对数据库中每一行进行操作变得更慢。

问题:

有没有一套SQL类型的命令或函数(最好是python或bash),不需要sqlite,能够直接在原始的以制表符分隔的文件上工作?比如说,不用表格来选择行,而是直接用列号。

示例

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

注意:我知道很多这些操作可以用awk、cut、bash-join等工具完成;我在想有没有更像SQL的方式?

3 个回答

0

我非常推荐微软的日志解析器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

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的 函数式编程工具 有了解的话,可能还能做出更厉害的东西。不过如果你对函数式编程不熟悉,光为了这个学习可能会有点复杂 ;-)


补充: 还有几个小建议:

  • 如果你每个脚本只打算执行一次“查询”,那么可以省去中间存储数据的步骤(在我的例子中是 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]
    
1

在网上搜索 python equivalent of DBD::CSV 的时候,我发现了 KirbyBase。看起来这个东西挺合适的。

不过因为我一般不使用Python,所以我从来没有试过它。

补充说明: 好吧,看看文档之后,发现它的查询命令虽然不完全是SQL,但比起用awk来说,确实更像SQL了。

撰写回答