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

标签 sql linux shell csv

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

无需将 CSV 文件内容导入 SQL 环境是否可行? 也许有某种基于 linux 的工具可以解决这个问题...

我知道这听起来像是一个棘手的问题,但我正在努力避免安装 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_inputs 中的 csv_dbs_examples 中可用)。

(使用 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 |

关于sql - 从 linux shell 读取带有 SQL 查询的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22017281/

相关文章:

mysql - 自定义 AUTO INCREMENT 值不起作用

sql - 具有变更历史的数据库设计

c - 结构生日的 Makefile(Linux 模块)

linux - 使用 CURL 抓取图像?

html - 在 Shell 脚本中使用 CURL 解析 HTML

python - 以新用户身份在 Ubuntu 中运行脚本时的 Shell 问题

sql - 有没有一种方法可以在Microsoft SQL Server中使用SQL Server Powershell搜索列?

python - Django 将原始 SQL 排序转换为 QuerySet API

linux - 编译FTDI内核模块

bash - ssh脚本不会将控制权返回给父脚本