我是一個使用 Clojure 語言的新手,但我在處理文本檔案時遇到了以下問題。這是我正在嘗試做的一個例子:
我有一個包含矩陣的檔案(backend.txt):
((A 10 "Ciel" 10)
(B 15 "Sprite" 10)
(C 20 "Coca-Cola" 10)
(D 12 "Fuze-Tea" 10)
(E 50 "Hattori-Sake" 10)
(F 40 "02Linn-Soju" 10)
(G 16 "Fanta" 10)
(H 25 "Canada-Dry" 10)
(A12 54 "Cigarros" 10)
(Kiero 78 "Calculadora" 10))
我還有以下“定位”功能:
(defn locate [token filename]
(with-open [rdr (clojure.java.io/reader filename)]
(let [line-no (atom 0)
result (filter #(.contains % token)
(line-seq rdr))]
(if result
(-> result first)
nil))))
基本上,“locate”函式接受兩個引數,一個標記和一個檔案名,并回傳檔案中包含標記的第一行。
(locate "Cigarros" "backend.txt")
> (A12 54 "Cigarros" 10)
的結果(locate "Cigarros" "backend.txt")
是一個字串:
(string? (locate "Cigarros" "backend.txt")
>true
我使用“讀取字串”方法將其轉換為序列。
(read-string (locate "Cigarros" "backend.txt"))
>(A12 54 Cigarros 10)
(seq? (read-string (locate "Cigarros" "backend.txt")))
>true
但是,請注意Cigarros
不再有雙引號,并且保留這??些雙引號非常重要,因為洗掉它們會與我腳本中的其他函式混淆。那么我該如何保存它們呢?
我期望的是將字串從結果轉換為(locate "Cigarros" "backend.txt")
這樣的串列:
(A12 54 "Cigarros" 10)
;; (seq? (A12 54 "Cigarros" 10))
;; > true
我希望我說清楚了,而不是聽起來令人困惑。
提前致謝。
uj5u.com熱心網友回復:
雙引號應該在那里 - 換句話說,Cigarros
應該仍然是一個字串。只是你用作 REPL 的任何東西都不會列印出來。
這是我的樣子:
(def s "(A12 54 \"Cigarros\" 10)")
=> #'dev/s
(read-string s)
=> (A12 54 "Cigarros" 10)
您可以通過執行來驗證您那里有一個字串(string? (nth (read-string s) 2))
。
另請注意,更好的方法可能是將檔案作為正確的 EDN 資料結構讀取,然后對其進行過濾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528642.html