14

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

考虑数据文件“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,但我不禁觉得这个问题之前已经解决了。我错过了什么吗?此功能是否已由另一个标准工具实现?

哈!

4

8 回答 8

3

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

tabtocsv 动物.txt | 名称列 - | tssql -table 动物 - \
'从动物组中选择 col1,max(as_int(col2)) 按 col1'

仅需要 namecolumns 是因为 animals.txt 没有标题行。通过查看示例脚本,您可以快速了解什么是可能的。主页底部也有类似工具的链接。

于 2010-04-01T00:47:35.610 回答
1

Perl DBI 使用DBD::AnyData

于 2010-02-17T02:59:17.750 回答
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')]
于 2010-02-17T04:03:31.623 回答
1

我只是偶然发现了这个 Python 脚本,它可以执行您想要的操作,尽管它只支持非常基本的查询。

于 2010-02-17T04:41:30.753 回答
0

我们将为sqlite 提供一个轻量级的 ORM,它可以简化此任务而无需任何配置文件等。

如果可以的话,PowerShell 有很多强大的功能来解析和查询文本文件(这里的例子)。否则,使用 .NET/Mono,您可以立即将其切入并使用 LINQ。

于 2010-02-17T02:40:54.173 回答
0

我从来没有设法找到我的问题的令人满意的答案,但我至少使用uniqs "-f" 选项找到了我的玩具问题的解决方案,这是我不知道的:

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

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

不过,我仍然对类似 SQL 的工具抱有希望。

于 2010-02-27T02:37:31.050 回答
0

我做了一个可能有帮助的工具。 http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms 您的 sql 可以是“从动物中选择最大值(值)”,也可以通过“从动物中按值 desc 顺序选择 *”

于 2012-12-18T05:56:12.800 回答
0

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

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

他们也有试用版

于 2016-07-22T12:58:01.413 回答