从linux shell读取带有SQL查询的CSV文件

Ror*_*rro 5 sql linux csv shell

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

这是否可以在不必将CSV文件内容导入SQL环境的情况下实现?也许有某种基于Linux的收费可以解决它......

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

任何线索?

Grz*_*cki 7

还有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' "$@"
Run Code Online (Sandbox Code Playgroud)

显示如何连接三个表(可在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 |
Run Code Online (Sandbox Code Playgroud)

csvsql

$ csvsql --query 'SELECT CDTitle,Location,Artist FROM CDs JOIN Artists ON CDs.ArtistID=Artists.ArtistID JOIN Locations ON CDs.LocID = Locations.LocID' "$@" | csvlook
Run Code Online (Sandbox Code Playgroud)

生产:

| CDTitle  | Location  | Artist  |
| -------- | --------- | ------- |
| CDTitle1 | Location1 | Artist1 |
| CDTitle2 | Location2 | Artist1 |
| CDTitle3 | Location1 | Artist2 |
| CDTitle4 | Location2 | Artist2 |
Run Code Online (Sandbox Code Playgroud)


Ric*_*ish 5

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

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