gpt4 book ai didi

sql - 从命令行对 CSV 文件内容运行 SQL 查询?

转载 作者:行者123 更新时间:2023-12-03 07:51:32 25 4
gpt4 key购买 nike

我有一个(语法有效,但不是很大)CSV 文件。我想对其运行任意 SQL SELECT 查询;让我们假设 in 可以是一个复杂的查询,带有一些内部查询,带有自连接,可能带有窗口函数等。

现在,显然,我可以安装一个 DBMS,运行服务器进程,创建一个新的数据库,也许创建一个适当的表,将 CSV 数据加载到表中,然后最后使用数据库的客户端来发送查询并得到结果。

但是 - 这似乎很麻烦,而且我不需要再次加载数据库表来进行另一个查询。

那么,有没有一种更简单的方法可以通过命令行/shell session 来做到这一点,希望没有那么多开销和空间浪费?

注释:

  • 我并不反对编写简短的脚本(bash、Python、Perl)。
  • 您可以采用任何您喜欢的特定 SQL 语言变体;我会根据需要进行调整。
  • 您可以假设操作系统是 GNU/Linux(如果这样更容易的话)。

最佳答案

如果您的操作系统中安装了 Java(这很常见),并且通过组合 Ant(脚本)和 H2(内存数据库),您可以从 CSV 文件中的数据运行复杂的 SQL 查询。

例如,如果您有文件 my_file.csv如:

"name",     "sex", "age", "height", "weight"
"Alex", "M", 41, 74, 170
"Bert", "M", 42, 66, 166
"Dave", "M", 39, 72, 167
"Elly", "F", 30, 70, 124
"Luke", "M", 34, 72, 163
"Omar", "M", 38, 69, 145
"Page", "F", 31, 67, 135
"Ruth", "F", 28, 65, 131

然后您可以创建script1.xml Ant 脚本:

<project default="sql">

<target name="sql">

<sql driver="org.h2.Driver" url="jdbc:h2:mem:" userid="sa" password=""
classpath="./h2-2.1.214.jar" onerror="abort" print="true"
showheaders="true" showtrailers="true" showWarnings="true" >

create table my_data as select * from csvread('my_file.csv');

select *
from my_data a
join (
select * from my_data where sex = 'M'
) b on b.height &lt; a.height
where a.sex = 'F'

</sql>

</target>

</project>

下载并解压Apache Ant 1.10.14(或其他版本)到文件夹apache-ant-1.10.14/下。然后下载该文件夹中的H2数据库jar文件。你的目录应该是这样的:

apache-ant-1.10.14/
h2-2.1.214.jar
my_file.csv
script1.xml

然后,运行它:

apache-ant-1.10.14/bin/ant -f script1.xml

第一个 SQL 语句将 CSV 数据加载到内存中。第二个是您的“复杂”查询:

[sql] Executing commands

[sql] NAME,SEX,AGE,HEIGHT,WEIGHT,NAME,SEX,AGE,HEIGHT,WEIGHT
[sql] Elly,F,30,70,124,Bert,M,42,66,166
[sql] Elly,F,30,70,124,Omar,M,38,69,145
[sql] Page,F,31,67,135,Bert,M,42,66,166
[sql]
[sql] 2 of 2 SQL statements executed successfully

BUILD SUCCESSFUL
Total time: 0 seconds

就是这样!

注释:

  • 对于变量查询字符串,您可以将其外部化到文件中,然后使用 <transaction src="command.sql" />而不是我包含的嵌入式 SQL。您可以根据需要使用多个标签。

  • 对于变量 CSV 文件名(或任何参数值),您可以添加 -Dcsvfile=my_file.csv在命令行中,然后在脚本中将其用作 ${csvfile} 。您可以根据需要定义许多参数。

  • H2 根据定义不是系统级安装的数据库,而是嵌入式数据库。不过,您可以将 JAR 文件放置在您想要的任何位置,然后使用 <classpath>标签来引用系统类路径,而不是更简单的 classpath本例中的属性。请参阅Ant -> Ant 任务 -> 任务列表 -> Sql 和 <classpath> 了解详情。

  • 作为一个数据库,H2是相当强大的。我将其 SQL 支持评定为中高,因此它实现了您在昂贵的数据库中可以找到的大多数常见 SQL 语法和功能。

  • 请注意,SQL 查询使用 XML 格式嵌入到脚本中。这就是为什么 <符号转义为 &lt; 。如果您不喜欢这样,可以使用 <transaction> 将查询放入外部文件中(无需转义)标签。

  • 您还可以将结果输出为 CSV 或其他格式,以供进一步处理或供其他工具使用。

关于sql - 从命令行对 CSV 文件内容运行 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76953964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com