用linux shell从SQL查询中读取一个CSV文件

我想从shell读取一个CSV文件,就好像它是一个SQL数据库表一样。

这是可能的,而不必将CSV文件内容导入到SQL环境? 也许有一些基于Linux的收费,可以解决它…

我知道这听起来像一个棘手的问题,但我试图避免安装一个SQL服务器和东西。 我有一些限制。

任何线索?

看看https://github.com/harelba/q ,一个将文本视为数据库的Python工具。 默认情况下,它使用空格来分隔字段,但-d ,参数将允许它处理CSV文件。

或者,您可以将CSV文件导入SQLite,然后对其运行SQL命令。 这是可以脚本化的,只需要一点努力。

还有csvsql ( csvkit的一部分)!

它不仅可以在给定的csv上运行sql(将其转换为场景后面的sqlite),还可以转换并插入许多支持的sql数据库之一!

在这里你有示例命令(也在csvsql_CDs_join.sh中 ):

 csvsql --query 'SELECT CDTitle,Location,Artist FROM CDs JOIN Artists ON CDs.ArtistID=Artists.ArtistID JOIN Locations ON CDs.LocID = Locations.LocID' "$@" 

显示如何连接三个表(可在csv_dbs_examples中的csv_inputs中获得 )。

(用csvlook格式化也是csvkit的一部分)

输入

 $ csvlook csv_inputs/CDs.csv | CDTitle | ArtistID | LocID | | -------- | -------- | ----- | | CDTitle1 | A1 | L1 | | CDTitle2 | A1 | L2 | | CDTitle3 | A2 | L1 | | CDTitle4 | A2 | L2 | $ csvlook csv_inputs/Artists.csv | ArtistID | Artist | | -------- | ------- | | A1 | Artist1 | | A2 | Artist2 | $ csvlook csv_inputs/Locations.csv | LocID | Location | | ----- | --------- | | L1 | Location1 | | L2 | Location2 | 

csvsql

 $ csvsql --query 'SELECT CDTitle,Location,Artist FROM CDs JOIN Artists ON CDs.ArtistID=Artists.ArtistID JOIN Locations ON CDs.LocID = Locations.LocID' "$@" | csvlook 

生产:

 | CDTitle | Location | Artist | | -------- | --------- | ------- | | CDTitle1 | Location1 | Artist1 | | CDTitle2 | Location2 | Artist1 | | CDTitle3 | Location1 | Artist2 | | CDTitle4 | Location2 | Artist2 |