Csv

SQL 查詢多個 CSV 文件的好方法?

  • November 7, 2017

我正在尋找一種將 CSV 文件作為關係數據庫表進行遍歷的方法。

我做了一些研究,因為沒有發現完全符合我的要求。我發現了幾個部分不錯的選擇,即:

  1. termsql - 接受標準輸入或文件並允許在其上使用一些 sql - 但只設置一個“表”
  2. csv2sqlite - 這是非常有前途的,因為它可能比 termsql 允許更多的 sql 優點 - 但仍然只有一個“表”
  3. 這個 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,它用於列印兩個文件共有的行(或僅存在於其中一個或另一個文件中,或類似的東西)。

另請注意,兩者joincomm都可以通過-用作文件名來對標準輸入進行操作。


如果您想要等效於帶有“group by”子句的 SQL“count()”命令,只需獲取所需的列(join將使用連接欄位進行排序,或者如果它直接來自文件,則可以自行排序)和管它通過uniq -c


awkjoinuniqcommsort之間,您可以使用 CSV 做一些非常漂亮的事情。並且所有這些都符合 POSIX。

引用自:https://unix.stackexchange.com/questions/314710