在本文中,我们将介绍一些可用于快速方便地从 .csv、.tsv 和 .json 文件等中提取见解的工具!
您是否曾经收到过一份文件并要求您查找其中隐藏的重要信息?如果您能以快速有效的方式查询文件,您的同事会印象深刻。但是……你究竟要如何实现这样的壮举?
您可能知道,SQL 允许您快速轻松地修改数据库数据。在尝试处理数据文件时,开发人员通常将数据加载到数据库中并通过Arctype等 SQL 客户端进行管理。在一个完美的世界中,您只需查询数据库即可获取公司所需的信息。
但在现实生活中,有一个问题:数据加载通常并不简单。Aa如果可以直接在文件上运行 SQL 查询,跳过数据库设置步骤,那将非常方便。事实证明,其他人已经注意到了这一事实,并构建了**直接使用 SQL 查询文件的工具。**在本文中,我们将介绍一些工具并列出它们可以处理的一些不同的 SQL 文件查询场景。我们还将比较这些工具并分享一些一般注意事项。让我们开始。
文本QL
如果您正在寻找用于查询 .csv 或 .tsv 文件的简单工具,TextQL 可能适合您。TextqQL允许您轻松地对结构化文本执行 SQL。它还允许您使用引号转义的分隔符。运行查询时,TextQL 可以自动检测适当格式的数字和日期时间数据,从而帮助您更轻松地工作。TextQL 允许您列出任意数量的文件和文件夹。您可以通过在命令末尾列出它们来加载正在使用的文件或目录。
安装
让我们看看几种安装 TextQL 的方法。您可以用来入门的最简单方法之一是使用 Homebrew。只需运行以下命令:
brew install textql
复制
如果您正在运行 Docker,您还可以使用一个简短的命令安装 TextQL:
docker build -t textql .
复制
最后,如果您使用的是 Linux,您可能熟悉 AUR 工具。AUR 安装也很简单:
yaourt textql-git
复制
现在我们已经设置并运行了 TextQL,让我们看看它可以做什么。
例子
我们将通过一个示例来了解 TextQL 的工作原理。假设我们有以下数据:
cat sample_data.csv Id,name,value,timestamp 1, Jack,5,1643004723 1, John,11,1643114723 1, James,-3,1645596723
复制
现在,不包括标题,让我们计算我们拥有的数据项的数量。
textql -header -sql "select count() from sample_data" sample_data.csv #output 3
复制
您应该看到“3”的输出,这正是我们所期望的。我们还可以使用 TextQL 来找到该数据的最大值。我们可以通过运行以下命令来做到这一点:
textql -header -sql "select max(value) from sample_data" sample_data #output 11
复制
再次,我们看到了 11 的期望值。
q
如果您正在使用 .csv 或 .tsv 文件并且需要比 TextQL 运行得更快的东西,您可能会考虑使用 q来查询您的文件。q 旨在通过提供对多文件 SQLite3 数据库的直接访问和对文本作为实际数据的简单访问,将 SQL 的表达能力带入 Linux 命令行。
q 使用 SQLite 引擎。它允许您直接在表格文本数据上运行类似 SQL 的语句,并自动缓存数据以加快对同一文件的后续查询。使用 q,SQL 语句可以直接在多文件 SQLite3 数据库上运行,而无需将它们合并或加载到内存中。
安装
像 TextQL 一样,通过 homebrew 安装 q 很容易。只需运行以下命令:
brew install harelba/q/q
复制
q 还有一个独立的可执行文件,您可以从此链接下载。如果您想使用 Windows 安装程序,您可以运行可执行文件并按照屏幕上显示的提示进行操作。可以在此处找到完整的安装说明以及每个平台的版本。
您还可以将 q 安装为 .rpm 包。您可以从此链接下载软件包,然后通过以下命令安装它:
rpm -ivh <package-filename> Or rpm -U <package-filename>
复制
例子
为了了解 q 的工作原理,让我们对列名为 a1、a2、… aN 的文件运行查询。
q -H "select a1,a5 from file.csv"
复制
现在,我们将计算特定字段中的 DISTINCT 值。在这种情况下,让我们尝试使用以下命令查看我们有多少个 UUID:
q -H -t "SELECT COUNT(DISTINCT(uuid)) FROM ./file.csv"
复制
此命令的输出将是一个数值,等于文件中 UUID 的数量。
OctoSQL
OctoSQL 主要是一个命令行应用程序,它允许您在单个界面中使用 SQL 查询各种数据库和文件类型,并在它们之间执行 JOINS。OctoSQL是一个完全可扩展、功能齐全的数据流引擎,可用于为您的应用程序提供 SQL 接口。它根据数据库类型验证和优化查询。它可能会在完成完整查询之前处理大量数据并返回部分结果。开箱即用,OctoSQL 仅支持 .csv 和 JSON 文件。您需要安装插件来查询其他文件格式,例如 Excel 或 Parquet 文件。
安装
您可以运行以下命令来使用 Homebrew 安装 OctoSQL。
brew install cube2222/octosql/octosql
复制
也支持用 Go 安装,如下图:
go install -u github.com/cube2222/octosql
复制
如前所述,OctoSQL 具有强大的插件功能。您可以使用如下所示的命令安装插件:
octosql plugin install postgres
复制
例子
让我们看一个票据数据的简单示例。假设我们有 .csv 格式的票据数据,格式如下:
octosql "SELECT * FROM ./invoice2.csv" cust_id,cust_name,value 121, Jack,599.00 122, John,1100.00 123, James,400.50
复制
假设我们要计算票据价值的总和。在这种情况下,我们可以使用以下命令来找到答案:
#Sum octosql "SELECT id, SUM(value) as value_sum FROM ./invoices2.csv GROUP BY id ORDER BY value sum DESC”
复制
同样,我们可以使用以下命令找到所有条目的计数:
#Count octosql "SELECT COUNT(*) FROM mydb.customer”
复制
我们还可以执行更高级的操作,例如连接。下面的命令将得到我们想要的:
octosql "SELECT inv_id, value, email FROM ./invoices.csv JOIN mydb.customers ON customer_id = customer_id”
复制
如果您需要一个可以处理各种文件格式的工具,OctoSQL 可能是您的理想选择。很少有人考虑的一个缺点是 OctoSQL 使用自定义引擎而不是 SQLite,这表明它可能缺少某些功能。
DSQ
DSQ是一个命令行工具,可让您执行 SQL 查询。它支持多种文件格式,包括 .csv、JSON、.tsv、Excel、Parquet 和 .ods。
安装
要在 Mac 或 Linux 操作系统上安装 DSQ,请使用以下命令,访问版本页面并下载所需的版本。然后只需解压缩下载并将 DSQ 添加到您的 $PATH。对于 Windows,您可以按照相同的步骤进行操作。
您还可以使用以下命令在 Go 中安装 DSQ:
$ go install github.com/multiprocessio/dsq@latest
复制
例子:
DSQ 允许您流式传输数据或提供要使用的文件名。下面的示例显示了如何根据您的要求使用 .json 或 .ndjson 格式。
$ dsq testdata.json "SELECT * FROM {} WHERE x > 10" #or $ dsq testdata.ndjson "SELECT name, AVG(time) FROM {} GROUP BY name ORDER BY AVG(time) DESC"
复制
您还可以使用 DSQ 处理来自不同来源类型的数据。下面的示例连接一个 .csv 数据集和一个 .json 数据集。
$ dsq testdata/join/users.csv testdata/join/ages.json \ "select {0}.name, {1}.age from {0} join {1} on {0}.id = {1}.id"
复制
如果您需要一个可以处理各种文件格式并使用 SQLite 的工具,那么这就是您的工具。
SQL 文件查询案例
要查看这些工具的实际效果,让我们看几个 SQL 文件查询示例。我们将在这些示例中使用 .txt 或 .csv 文件,因为我们上面讨论的几乎所有工具都支持这种文件格式。
通过 SQL 过滤
过滤允许您仅查看您希望查看的信息。过滤器可用于仅显示表单或报表中所需的记录。使用过滤器,您可以限制视图中的数据,而不会影响底层对象的体系结构。
例如,让我们从包含以下信息的文本文件中选择记录开始:
班级 | 姓名 | 英语 | 历史 | 数学 |
---|---|---|---|---|
1 | 詹姆斯·金 | 78 | 65 | 67 |
1 | 约翰怀特 | 87 | 61 | 79 |
2 | 佩奇戴维斯 | 77 | 82 | 94 |
3 | 埃德温·亨德森 | 65 | 78 | 94 |
假设我们要在上述文件中选择班级 1 的学生。该文件的第一行提供列名,而其余行包含全面的信息,我们可以使用这些信息来查询我们想要的记录。因此,我们可以运行以下命令来获取我们想要的信息:
$select * from E:/txt/Students_file.txt where CLASS = 1
复制
在 SQL 中,您可以按一列或多列以升序或降序对数据进行排序。为了试试这个,让我们按班级升序排列学生分数表,按降序排列总分。我们可以使用以下命令来做到这一点:
$select * from E:/txt/Students_file.txt order by CLASS,ENGLISH+HISTORY+MATH desc
复制
您可以通过根据记录的值对记录进行分组来使用聚合来组合结果。分组还可用于计算组中许多值的总和。分组聚合给出一组行的摘要。例如,您可以使用以下命令查找最低英语分数、最高历史分数和总体数学分数。
$select CLASS,min(English),max(History),sum(Math) from E:/txt/students_file.txt group by CLASS
复制
如您所见,直接对文件执行 SQL 查询的能力可以帮助我们回答来自数据的重要问题。
结论
总之,让我们使用下面的图表快速浏览一下我们之前提到的所有工具。
名称 | 支持的文件 | 引擎 |
---|---|---|
q | .csv、.tsv | SQLite |
文本QL | .csv、.tsv | SQLite |
OctoQL | .csv、.json、Excel、Parquet | Custom |
DSQ | .csv、.tsv、.json、Parquet、Excel、日志 | SQLite |
无需通过数据库,您可以使用上述工具对文件执行 SQL 以获得即时洞察力。这些工具中的每一个都有不同的优缺点,因此请务必选择最适合您需求的选项。
原文标题:How To Use SQL to Directly Query Files
原文作者:Harshil Patel
原文地址:https://dzone.com/articles/how-to-use-sql-to-directly-query-files