racket腳本日常

前言

用racket寫腳本休偶。

讀取梁厉、格式化CSV

#lang racket/base

(require racket/file
         racket/contract
         racket/string)

(define (zip xs ys)
  (map list xs ys))

(define 目標(biāo)文件
  (string->path "./file/sample.csv"))

(define/contract (讀取文件 文件名)
  (-> path? string?)
  (file->string 文件名 #:mode 'text))

(define/contract (格式化一行 行 頭)
  (-> string? (listof string?) (listof pair?))
  (define 行元素列表
    (map string-normalize-spaces (string-split 行 ",")))
  (zip 頭 行元素列表))

(define/contract (格式化 輸入)
  (-> string? (listof hash?))
  (define 所有行 (string-split 輸入 "\n"))
  (let ([標(biāo)題行 (string-split (car 所有行) ",")]
        [內(nèi)容行 (cdr 所有行)])
    (map (λ (行) (make-hash (格式化一行 行 標(biāo)題行))) 內(nèi)容行)))

(define/contract (文件->CSV 路徑)
  (-> path? (listof hash?))
  (格式化 (讀取文件 路徑)))

(displayln (文件->CSV 目標(biāo)文件))

這里處理方式與普通語言沒什么不同,都是從文件中讀取全部內(nèi)容,之后進行格式化词顾。

csv文件內(nèi)容八秃,逗號后面可以跟空格。

name,age
haoren, 10
huairen,20

最后輸出:

(#hash(( age . (10)) (name . (haoren))) #hash(( age . (20)) (name . (huairen))))

SQLite3

racket提供了db模塊肉盹,可以直接使用sqlite3昔驱。

我們先定義一個結(jié)構(gòu)體,可以簡單把它當(dāng)成表結(jié)構(gòu)上忍。

(struct user
  (id name age)
  #:transparent)

user有一個id骤肛,它是主鍵,同時窍蓝,它也是自增的腋颠。開始之前,我們需要先連接到一個數(shù)據(jù)庫上它抱。

(define conn (sqlite3-connect #:database db-path
                              #:mode 'create))

db-path可以是stringpath,連接模式(#:mode)有三種:'read-only表示只讀朴艰;'read/write表示可讀寫观蓄;'create'read/write差不多,當(dāng)它找不到數(shù)據(jù)庫時祠墅,會自動創(chuàng)建侮穿。

建表

(define/contract (create-tables-unless)
  (-> (or/c boolean? void?))
  (or (table-exists? conn "users")
      (local [(define sql "create table users (id integer primary key, name text not null, age int not null)")]
        (query-exec conn sql))))

我用table-exists?判斷是否已經(jīng)建過表了。其實可以直接使用if not exists語句一次性判斷加創(chuàng)建毁嗦。但是在執(zhí)行時亲茅,racket報錯了。

(create-tables-unless)
; query-exec: near "if": syntax error
;   error code: 1

它把if當(dāng)成racket語句解析了狗准,也難怪克锣,if本身就是個宏,在執(zhí)行時直接展開了腔长。如果我們換成大寫的IF就沒問題了袭祟。

插入

我們需要插入兩個值,一個name和一個age捞附。

(define/contract (insert-user name age)
  (-> string? positive? positive?)
  (define insert-sql "insert into users (name, age) values (?, ?)")
  (query-exec conn insert-sql name age)
  (define last-row-id-sql "select last_insert_rowid()")
  (query-value conn last-row-id-sql))

sqlite3需要last_insert_rowid()函數(shù)去獲取最后得到id巾乳,插入一個記錄后我們返回它的id。

(insert-user "huairen" 20)
2

查詢

query-row和query-list

query-row查詢一行記錄鸟召,返回vectory胆绊;query-list查詢一列記錄,返回list欧募。它們都有一個特點压状,都必須是固定行數(shù)、列數(shù)跟继。query-row查詢結(jié)果必須為一行何缓,query-list查詢結(jié)果必須只有一列肢础。

(query-row conn "select * from users limit 1")
'#(1 "haoren" 10)
(query-list conn "select name from users")
'("haoren" "huairen")

find-by-id

我們偶爾想來個按id查詢。

(define/contract (find-user-by-id id)
  (-> positive? (or/c #f user?))
  (define result (query-maybe-row conn "select * from users where id = ?" id))
  (and result (apply user (vector->list result))))

我們把查詢找到了記錄直接轉(zhuǎn)換成user碌廓。

(find-user-by-id 2)
(user 2 "huairen" 20)
main.rkt> (find-user-by-id 20)
#f
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末传轰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谷婆,更是在濱河造成了極大的恐慌慨蛙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪挎,死亡現(xiàn)場離奇詭異期贫,居然都是意外死亡,警方通過查閱死者的電腦和手機异袄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門通砍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烤蜕,你說我怎么就攤上這事封孙。” “怎么了讽营?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵虎忌,是天一觀的道長。 經(jīng)常有香客問我橱鹏,道長膜蠢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任莉兰,我火速辦了婚禮挑围,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糖荒。我一直安慰自己贪惹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布寂嘉。 她就那樣靜靜地躺著奏瞬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泉孩。 梳的紋絲不亂的頭發(fā)上硼端,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音寓搬,去河邊找鬼珍昨。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镣典。 我是一名探鬼主播兔毙,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兄春!你這毒婦竟也來了澎剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赶舆,失蹤者是張志新(化名)和其女友劉穎哑姚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芜茵,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡叙量,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了九串。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绞佩。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猪钮,靈堂內(nèi)的尸體忽然破棺而出品山,到底是詐尸還是另有隱情,我是刑警寧澤躬贡,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布谆奥,位于F島的核電站眼坏,受9級特大地震影響拂玻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宰译,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一檐蚜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沿侈,春花似錦闯第、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛛淋,卻和暖如春咙好,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐荷。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工勾效, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓层宫,卻偏偏與公主長得像杨伙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萌腿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容