Python/Bash 用于 TSV 平面文件的 SQL(无 SQLite)
背景:
sqlite非常适合对已经加载到数据库中的数据进行SQL操作,但在我的工作中,很多时候我需要对那些没有加载到数据库中的文件进行选择、连接和条件查询,这样的文件不一定值得花时间去加载到数据库中。此外,sqlite的随机访问特性常常使得对数据库中每一行进行操作变得更慢。
问题:
有没有一套SQL类型的命令或函数(最好是python或bash),不需要sqlite,能够直接在原始的以制表符分隔的文件上工作?比如说,不用表格来选择行,而是直接用列号。
示例
select col1,col2,col3 from fileName.tsv where col1[int] < 3
注意:我知道很多这些操作可以用awk、cut、bash-join等工具完成;我在想有没有更像SQL的方式?
3 个回答
我非常推荐微软的日志解析器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
你可以用 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]
在网上搜索 python equivalent of DBD::CSV
的时候,我发现了 KirbyBase。看起来这个东西挺合适的。
不过因为我一般不使用Python,所以我从来没有试过它。
补充说明: 好吧,看看文档之后,发现它的查询命令虽然不完全是SQL,但比起用awk来说,确实更像SQL了。