Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对平面文件的简单、快速SQL查询_Sql_Linux_Sorting_Flat File - Fatal编程技术网

针对平面文件的简单、快速SQL查询

针对平面文件的简单、快速SQL查询,sql,linux,sorting,flat-file,Sql,Linux,Sorting,Flat File,有人知道使用类似SQL的声明性查询语言提供简单、快速的平面文件查询的工具吗?我不愿意支付将文件加载到数据库的开销,因为输入数据通常在查询运行后立即抛出 考虑数据文件“anives.txt”: 假设我想为每个独特的动物提取最高值。我想写一些类似于: cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1" 使用排序,我可以得到几乎相同的结果: cat animals.txt | sort -t "

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

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

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

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"
使用
排序
,我可以得到几乎相同的结果:

cat animals.txt | sort -t " " -k1,1 -k2,2nr
我总是可以从那里进入
awk
,但这一切都让我感觉有点
awk
ward(无法抗拒),因为一种类似SQL的语言似乎可以如此清晰地解决问题

我曾经考虑过为SQLite编写一个包装器,它将根据输入数据自动创建一个表,并且我也研究过在单处理器模式下使用Hive,但是我忍不住觉得这个问题以前已经解决了。我错过什么了吗?此功能是否已由另一个标准工具实现

我们将有一个可以简化此任务而不需要任何配置文件等的


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

使用Perl DBI,您可以使用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')]

我只是偶然发现了一个类似于你想要的东西,尽管它只支持非常基本的查询。

我从来没有找到一个满意的答案来回答我的问题,但我至少找到了一个解决我的玩具问题的方法,使用了
uniq
s“-f”选项,这是我不知道的:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1
显然,如果输入文件是用相反顺序的列创建的,那么上面的
awk
部分可以完全跳过

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

我写这篇文章的主要目的是在平面文件上进行SQL选择。以下是示例的命令链(所有这些命令都来自TxtSushi):

tabtocsv animals.txt |名称列-| tssql-表格动物-\ '按col1从动物组中选择col1,max(as_int(col2))'
namecolumns是必需的,因为animals.txt没有标题行。你可以通过浏览网页快速了解可能发生的事情。主页底部还有类似工具的链接。

我制作了一个可能有用的工具。 您的sql可以是“从动物中选择最大值” 也可以通过“按值描述从动物顺序中选择*”

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

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


他们也有试用版

非常好。它的规模有多大?我希望处理超过我机器上可用RAM的多GB文件。它使用流式方法进行任何类型的行过滤或列选择,但只要您要求它执行任何需要排序的操作(分组、加入、按所有要求排序),它就会将整张表读取到内存中。在这种情况下,您可以提供-external sort选项,它告诉TxtSushi在磁盘上进行排序,但我当前的外部排序实现效率非常低,需要一些工作。我希望能够从shell中正确地完成所有操作,而此解决方案似乎不支持。哪一个?Powershell是对类固醇的猛击,它可以让你从外壳开始做任何事情。至于OrmLite(我会使用它),您可以编写几行程序,将所有数据导入您选择的数据库,然后您可以使用sqlite3.exe从命令提示符进行查询。我希望能够从shell中正确执行所有操作,而此解决方案似乎不支持。
cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1
tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 'select col1, max(as_int(col2)) from animals group by col1'