SQL 查詢多個 CSV 文件的好方法?
我正在尋找一種將 CSV 文件作為關係數據庫表進行遍歷的方法。
我做了一些研究,因為沒有發現完全符合我的要求。我發現了幾個部分不錯的選擇,即:
- termsql - 接受標準輸入或文件並允許在其上使用一些 sql - 但只設置一個“表”
- csv2sqlite - 這是非常有前途的,因為它可能比 termsql 允許更多的 sql 優點 - 但仍然只有一個“表”
- 這個 ULSE 問題- 它描述瞭如何使用 unix 文件遍歷命令實現集合操作 - 有希望和可能的起點
在單個csv/文本文件(列總和、平均值、最小值、最大值、子集等)上遍歷和執行一些類似數據庫的操作是可能的,並且非常簡單,但不能在兩個文件上進行,它們之間有一些聯繫。也可以將文件導入臨時數據庫進行查詢,我已經這樣做了,雖然不像我想要的那樣實用。
TL;DR - 我基本上想要一種方便的方法來對 csv 文件進行快速而骯髒的 sql 連接。不是在尋找一個完整的基於文本的 RDBMS,而是一個更好的方法來對 csv RDBMS 提取進行一些分析。
例子:
sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'
這似乎是一個足夠有趣的問題,我可以花一些時間來解決,但我想知道它是否已經存在。
看看fsql (Perl) 或csvkit (Python)。它們都有各種問題和局限性,但它們通常適用於“小”數據。而且,當然,當它們還不夠時,您總是可以回退到適當的數據庫。
**您想要的是
join
**由POSIX 指定的命令。這是您的範例虛擬碼命令:
sqlthingy -i tbl1.csv tbl2.csv -o 'select 1,2,3 from tbl1, tbl2 where tbl1.1 = tbl2.1'
這是一個等效的實際工作命令
join
:join -t, tbl1.csv tbl2.csv
如果兩個文件只有兩個欄位,用逗號分隔,則此
join
命令正是您在虛擬碼中表示的內容。如果他們有更多欄位,但您只需要每個文件的第二個欄位,仍然加入第一個欄位,您可以使用:
join -t, -o 0,1.2,2.2 tbl1.csv tbl2.csv
如果您想加入不同的領域,也有相應的標誌。
它不是一個成熟的 RDBMS。例如,您僅限於兩個文件和一個連接欄位。但是對於您的要求:
TL;DR - 我基本上想要一種方便的方法來對 csv 文件進行快速而骯髒的 sql 連接。不是在尋找一個完整的基於文本的 RDBMS,而是一個更好的方法來對 csv RDBMS 提取進行一些分析。
它完全符合要求。
您還應該檢查POSIX 指定的
comm
,它用於列印兩個文件共有的行(或僅存在於其中一個或另一個文件中,或類似的東西)。另請注意,兩者
join
和comm
都可以通過-
用作文件名來對標準輸入進行操作。如果您想要等效於帶有“group by”子句的 SQL“count()”命令,只需獲取所需的列(
join
將使用連接欄位進行排序,或者如果它直接來自文件,則可以自行排序)和管它通過uniq -c
。在awk、join、uniq、comm和sort之間,您可以使用 CSV 做一些非常漂亮的事情。並且所有這些都符合 POSIX。