Q——用sql語句查詢CSV資料

在日常資料處理中,很多時候檔案是一個很方便的載體,尤其是文字檔案可以方便傳輸,修改和批次處理。csv格式的檔案即具有文字檔案的便捷性和資料表格的表現和規範性是是一個被廣為使用的資料格式,絕大多數系統支援透過csv來匯入匯出資料。同時SQL語言也是一個被大家熟知和喜愛的指令碼語言,在資料庫處理分析中廣泛使用。那麼有沒有同時支援csv和sql的解決方案呢?有,本文蟲蟲就給大家推薦一個這樣的工具q。

Q——用sql語句查詢CSV資料

概述

q是一個命令列工具,可以實現在 CSV/TSV(和任何其他表格文字檔案)上直接執行類似 SQL 的查詢。工具將普通檔案當作資料庫表,支援所有的SQL操作,比如WHERE、GROUP BY、JOIN等等,還支援自動列名和列型別檢測,支援多種編碼。

基本語句:

q “SELECT COUNT(*) FROM 。/chongchong。csv WHERE c3 > 32。3”

ps -ef | q -H “SELECT UID,COUNT(*) count FROM - GROUP BY UID ORDER BY count DESC LIMIT 3”

Q——用sql語句查詢CSV資料

多編碼支援:

非英語使用者:q完全支援所有型別的編碼。用 -e data-encoding設定輸入資料編碼,-Q query-encoding設定查詢編碼,並使用 -E output-encoding設定輸出編碼。預設會根據實際使用上下文對三個引數做合理設定。

Q——用sql語句查詢CSV資料

BOM支援:q允許讀取包含BOM的UTF8檔案的:使用-e utf-8-sig為了這。後續計劃將BOM處理與編碼本身分開,將允許支援所有編碼的 BOM。

安裝

Q支援跨平臺執行,但是需要基礎的python環境支援。可以在官方Github託管倉庫下載(github/harelba/q/releases),最新版本為2。0。19。

Q——用sql語句查詢CSV資料

Linux可以透過rpm或者deb包安裝:

安裝:

rpm -ivh q-text-as-data-2。0。19-1。x86_64。rpm

sudo dpkg -i q-text-as-data_2。0。19-2_amd64。deb

或者對舊版本的升級使用:

rpm -U q-text-as-data-2。0。19-1。x86_64。rpm

MacOS下可以使用brew來安裝:

brew install q

windows下可以下,對應的安裝包(q-AMD64-Windows-installer。exe

和q-AMD64-Windows。exe)安裝。

用法

q的用法很簡單,基本格式如下:

q 標誌 “sql查詢”

最簡單的一個例子是

q “SELECT * FROM myfile”

這結果和cat myfile一樣。

Q的查詢表示式應該是一個類似SQL的查詢,但是其中from的是用的csv的檔名代替表名,也可以用-表示標準輸入,這樣就可以接入到管道中。可以將多個檔案用作一個表,方法是用+將它們竄起來,寫成:

filename1+filename2+。。。

也可以使用shell 萬用字元,比如:

my_files*。csv

-H選項表示輸入包含標題行

。這時將自動探測列名,並可在查詢中使用。如果未提供此選項,則列將命名為cX,從1開始,比如:

q “SELECT c3,c8 from 。。。”

-d選項指定輸入分隔符

列型別由工具自動檢測,無需強制轉換。

注意,有一個選項 ——as-text,強制所有列都被視為文字列。

關於列的內容,根據 sqlite 標準,需要在帶有反引號的查詢中使用包含空格的列名。

完全支援查詢/輸入/輸出編碼,可以用-e,-E和-Q按需要控制編碼。

q支援所有sqlite3 SQL語法,包括跨檔案的連線(為每個表使用別名)。

查詢

q 獲取的每個引數都是一個完整的SQL查詢。所有的查詢都依次執行,將結果輸出到標準輸出。請注意,資料載入僅完成一次,因此在同一命令列上執行多個查詢時,只有第一個會花費很長時間。其餘的將查詢會立即執行出結果。

查詢語句中任何標準 SQL 表示式、條件(WHERE 和 HAVING)、GROUP BY、ORDER BY 等都是允許的。

WHERE子句中支援 JOIN 和子查詢, ROM 子句中不支援。執行 JOIN 時使用表別名。

所有SQL 語法都是基於sqlite的語法。

附加功能

q 支援 SQLite 不支援的幾個附加功能。要獲取其列表,請執行 q -L,其中列出了它們並描述了它們的語法。

它們可以用作任何標準的 sql 函式。

Q——用sql語句查詢CSV資料

實現

q的實現是用Python寫的記憶體資料庫,本身支援SELECT語句,包括 JOIN(目前僅在 WHERE 子句中支援子查詢)。如果想對資料做進一步的分析,可以使用 ——save-db-to-disk將結果表寫入sqlite資料庫檔案的選項,然後使用 seqlite3為了獨立於q本身對資料執行查詢。

限制

不支援 FROM子查詢

不支援公用表表達式 (CTE)

不支援檔名中的空格。使用stdin將資料傳送到q,或重新命名檔案。

尚不支援某些罕見的子查詢情況。

配合

標準的Linux shell工具很棒, Linux 整體理念是為工作的每個部分混合搭配最好的工具。q將SQL的功能新增到Linux工具集中,而不會失去任何其他工具的優勢。q可以與其他 Linux 工具一起配合使用,就像find,awk/sed 和 grep 一起使用(管道)。

需要注意是, Linux工具將文字視為文字而不是資料。從這個意義上說,可以將q視為元工具,它提供對 SQL 提供的所有資料相關工具(例如表示式、排序、分組、聚合等)的訪問。

總結

為了方便的對文字資料進行靈活的查詢分析和處理,q工具給csv文字檔案添加了sql查詢的功能,給我們資料處理提供了方便,q支援多字元編碼,支援多檔案查詢,支援透過管道和其他命shell工具配合使用,是一個非常值得嘗試和日常使用的工具。

相關文章