我想从 shell 中读取一个 CSV 文件,就好像它是一个 SQL 数据库表一样。
无需将 CSV 文件内容导入 SQL 环境是否可行? 也许有某种基于 linux 的工具可以解决这个问题...
我知道这听起来像是一个棘手的问题,但我正在努力避免安装 SQL 服务器和其他东西。我有一些限制。
有什么线索吗?
最佳答案
它不仅可以在给定的 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/