2019年6月27日 星期四

文字檔控用 SQL 語法肉博 csv

我是奉行 unix 哲學 的文字檔控。 用 grep 從 csv 檔撈資料的時候突然想到: 可不可以改用 SQL 指令來查詢 csv 檔呢? 果然搜尋到 qtextql 兩個專案。 而且後者直接用 apt install textql 安裝就可以用。 這工具除了讓 SQL 老手可以很方便地檢索 .csv 檔之外, 也很適合拿來當作 SQL 語法入門, 讓初學者可以 (省略無聊而繁瑣的建立資料庫步驟) 在十分鐘之內單刀直入從 (比較有趣的) SELECT 指令開始學起。

請下載兩個測試檔: 「台股所有上市櫃個股收盤價」 price.csv (整理自 證交所 政府開放資料) 還有今年所有個股的股利政策及除權息時間 dpann.csv (整理自 撿股讚)。 然後把兩個檔案最上方的 「代號」 都改成 sid, 「名稱」 都改成 name。

alias tql='textql -header -output-header -sql'
tql 'select *' price.csv
tql 'select sid, name, 收盤價 from price' price.csv
tql 'select * where sid like "11%" ' price.csv
tql 'select price.sid, price.name, 收盤價, 配息 from price join dpann where price.sid=dpann.sid and price.sid like "11%"' price.csv dpann.csv
tql 'select price.sid, price.name, 收盤價 as price, 配息 as div, round(配息*100.0/收盤價,2) as dy, 除息日 from price join dpann where price.sid=dpann.sid' price.csv dpann.csv > dy.csv
tql 'select * where dy>8 order by dy desc' dy.csv | less

重點提示:

  1. 我們先設一個 alias, 等一下指令變得比較短。 詳見 man textql
  2. 用 textql 查詢時, 如果只有一個 csv 檔, 可以省略 from 子句。
  3. 如果指令提到中文欄位名稱, 就不能省略 from 子句。 把檔名的 .csv 去掉, 就是表格名稱。
  4. 支援 like 子句, 但不支援 similar to 子句 (那就改用 perl 或 grep 就好了啊~)。
  5. join 兩個表格? 沒問題! 但是 fully qualified column name 不能有中文。 所以一開始需要把 「代號」 改成 sid, 「名稱」 改成 name。 我會建議所有欄位名稱通通改成英文比較簡單。
  6. round() 函數的參數竟然可以用中文欄位名稱! 不過... 因為 textql 下層其實是靠 go 版的 sqlite3 在驅動, 所以 支援的數學函數很有限
  7. [跳 tone] 下單前記得先確認今年第一季的 EPS 優於去年、 4跟5兩個月的營收呈現年成長, 並且多多搜尋、 爬文! 根據 我的股市初學淺見 及其他計算, 我選了華新科。 雖然5月營收 YoY 為負, 但若把異常供不應求的去年略去不看, 過去幾年持續成長, 感覺是長抱的好股, 就算明年的配息只有今年的七折, 也還是蠻划算的。 (可惜我先前把它當成波段炒股, 太早買, 套在略高價)

因為小時候資料庫老師用電風扇決定成績, 在我幼小的心靈裡造成了陰影, 所以後來根本就變成了一個 SQL 逃兵。 現在研究股票時, 經常用 grep 查看個股資訊。 但因為我的完整試算表欄位很多, 每次要跟標頭列對照, 看起來都很吃力。 現在有了這個工具, 研究股票時可以順便複習基本 sql 語法, 感覺很療癒啊~~ 圖解各種 join: 中文版 英文版 SQL cheat sheet

1 則留言:

  1. Dbeaver(通用型DB管理工具)可以透過CsvJdbc driver來SELECT CSV檔案,供參

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。