对平面文件进行简单,快速的SQL查询

时间:2010-02-17 02:34:23

标签: sql linux sorting flat-file

有没有人知道使用类似SQL的声明性查询语言提供简单,快速的平面文件查询的工具?我宁愿不支付将文件加载到DB中的开销,因为输入数据通常在查询运行后几乎立即被抛出。

考虑数据文件“animals.txt”:

dog 15
cat 20
dog 10
cat 30
dog 5
cat 40

假设我想为每个独特的动物提取最高值。我想写一些类似的东西:

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"

我可以使用sort得到几乎相同的结果:

cat animals.txt | sort -t " " -k1,1 -k2,2nr

我总是可以从那里进入awk,但是当一种类似SQL的语言似乎能够如此彻底地解决问题时,这一切都感觉有点awk病区(无法抗拒)。

我考虑过为SQLite编写一个包装器,它会根据输入数据自动创建一个表,我已经研究过在单处理器模式下使用Hive,但是我不禁觉得这个问题已经存在了之前解决了。我错过了什么吗?此功能是否已由其他标准工具实施?

HALP!

8 个答案:

答案 0 :(得分:3)

我写TxtSushi主要是为了在平面文件上做SQL选择。以下是您的示例的命令链(所有这些命令都来自TxtSushi):

tabtocsv animals.txt | namecolumns - | tssql -table animals - \
'select col1, max(as_int(col2)) from animals group by col1'

namecolumns只是必需的,因为animals.txt没有标题行。通过浏览example scripts,您可以快速了解可能的情况。主页底部还有指向类似工具的链接。

答案 1 :(得分:1)

Perl DBI使用DBD::AnyData

答案 2 :(得分:1)

你可以使用sqlite。这是使用Python的一个例子。

import sqlite3
conn = sqlite3.connect('/tmp/test.db')
cursor = conn.cursor()
try:
    cursor.execute("""create table table1 (word varchar not null, number varchar not null)""")
except: pass
cursor.execute("insert into table1 values ('dog', '15')")
cursor.execute("insert into table1 values ('cat', '20')")
cursor.execute("insert into table1 values ('dog', '10')")
cursor.execute("select max(number) , word from table1 group by word")
print cursor.fetchall()

输出

$ ./python.py
[(u'20', u'cat'), (u'15', u'dog')]

答案 3 :(得分:1)

我偶然发现了this Python script,它可以做出你想要的东西,虽然它只支持非常基本的查询。

答案 4 :(得分:0)

我们有lightweight ORM for sqlite可以简化此任务而无需任何配置文件等。

如果您可以使用PowerShell,则可以使用许多强大的功能来解析和查询文本文件(example here)。否则使用.NET / Mono,您可以立即切入并使用LINQ。

答案 5 :(得分:0)

我从未设法找到令人满意的问题答案,但我至少使用uniq s“-f”选项找到了我的玩具问题的解决方案,我一直不知道:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1

如果使用相反顺序的列创建输入文件,显然可以完全跳过上面的awk部分。

尽管如此,我仍然希望使用类似SQL的工具。

答案 6 :(得分:0)

我制作了一个可能有用的工具。 http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms 你的sql可能是“从动物中选择最大值(价值)” 或者它可以通过“选择*从动物订单按价值desc”

答案 7 :(得分:0)

您可以查找HXTT JDBC Drivers。它们为大多数类型的平面文件,excel等提供JDBC驱动程序。

您可以对其执行简单的SQL查询。

他们也有试用版