像sql一样查询csv文件

d-_*_*_-b -1 bash awk python csv

这显然是一个流行的面试问题:

有 2 个包含恐龙数据的 CSV 文件。我们需要查询它们以返回满足特定条件的恐龙。

有 2 个选择 - 仅使用 Unix 命令行工具 ( cut/// ) ,或者使用 Python 等脚本语言,但不使用、等附加paste模块。sedawkqfsqlcsvkit

编写一个程序来读取 csv 文件,并仅打印双足恐龙的名称,按速度从最快到最慢排序。

在 SQL 中,这很简单:

select f2.name from
file1 f1 join file2 f2 on f1.name = f2.name
where f1.stance = 'bipedal'
order by (f2.stride_length/f1.leg_length - 1)*pow(f1.leg_length*9.8,0.5) desc
Run Code Online (Sandbox Code Playgroud)

如何在 Bash 或 Python 中完成此操作?

Ste*_*nny 5

已经创建了一些工具来实现此目的。这是示例:

$ csvq 'select * from cities'
+------------+-------------+----------+
|    name    |  population |  country |
+------------+-------------+----------+
| warsaw     |  1700000    |  poland  |
| ciechanowo |  46000      |  poland  |
| berlin     |  3500000    |  germany |
+------------+-------------+----------+

$ csvq 'insert into cities values("dallas", 1, "america")'
1 record inserted on "C:\\cities.csv".
Commit: file "C:\\cities.csv" is updated.
Run Code Online (Sandbox Code Playgroud)

https://github.com/mithrandie/csvq

  • 是的,存在 fsql、csvkit 等工具,但问题是第三方开发人员的此类工具/模块将来可能不受支持,因此无法投入生产。此外,如果文件大小很大(以 TB 为单位),则可能无法正常工作。 (2认同)
  • 但不是所有工具都如此吗?如果您有 TB 级的数据,那么使用 csv 无论如何都是错误的数据存储方式。 (2认同)