2009-08-18 32 views
6

Tôi muốn lưu dữ liệu của mình vào một tệp và khôi phục dữ liệu khi chạy lại chương trình.Tôi làm cách nào để duy trì và khôi phục tệp bị hỏng của mình thành tệp?

tôi đã xác định defstruct của tôi như vậy:

(defstruct bookmark: url: title: comments)

Chương trình đơn giản sẽ làm như sau:
1. Nạp của defstruct từ url-db. txt
2. Đọc từ (các) tệp nhập được chuyển vào * command-line-args * và thêm vào dữ liệu nội bộ var.
3. Viết lại tệp url-db.txt.

tập tin nhập khẩu mẫu:

www.cnn.com | Tin tức | Đây là CNN
www.msnbc.com | Tìm kiếm |
news.ycombinator.com | Tin tức | Bản tin công nghệ

+0

Ai đó đã vấp phải vấn đề này trước tôi: http://stackoverflow.com/questions/923029/clojure-slurping-structs-from-file-fails-with-string-attributes-containing-white –

Trả lời

8

Tom Crayford là gần, nhưng sử dụng "pr" chức năng thay vì của "in". "pr" tạo ra các chuỗi có thể đọc lại bằng "đọc".

(defn save-db [db filename] 
    (spit 
    filename 
    (with-out-str (pr db)))) 

(defn load-db [filename] 
    (with-in-str (slurp filename) 
    (read))) 

Lưu ý rằng điều này sẽ không hoạt động nếu * in-dup * được đặt thành true. Xem ticket #176 Cũng lưu ý rằng khi bạn đọc lại cơ sở dữ liệu, các bản ghi sẽ là các bản đồ thông thường, chứ không phải bản đồ cấu trúc. Bản đồ cấu trúc không thể được tuần tự hóa với pr/read.

+0

Chỉ để chỉnh sửa của riêng tôi , là có một lý do bạn sử dụng với-in-str và với-out-str thay vì sử dụng read-string và pr-str? – alanlcode

+0

Không thực sự. Đừng nhớ tại sao tôi đã viết nó theo cách đó. –

+0

Khi nào đọc nó như một bản đồ thông thường thay vì bản đồ cấu trúc là một vấn đề? Tôi đã không gặp phải một nơi mà họ không thể hoán đổi cho nhau. Trong trường hợp này, mặc dù (tổng quát như bạn cần), bạn có thể hợp nhất mỗi bản ghi vào một dấu trang trống khi bạn đọc. –

2

Sử dụng nhổ và slurp (ví dụ lấy từ http://www.nofluffjuststuff.com/blog/stuart_halloway/2008/09/pcl__clojure_chapter_3_1). Nói chung kỹ thuật này được gọi là serializing.

(defn save-db [db filename] 
    (spit 
    filename 
    (with-out-str (pr db)))) 

(defn load-db [filename] 
    (with-in-str (slurp filename) 
    (read))) 

(là Lỗi in trước đó trong mã gốc, và tôi đã câm và không kiểm tra nó. Cảm ơn) câu trả lời

+0

(def x (struct đánh dấu "news.ycombinator.com" "News" "Tech News")); Không xử lý "Mọi thứ trong dấu ngoặc kép" –

+0

Ví dụ của anh ta có tên trong dấu ngoặc kép. Khi tôi cố gắng tải lại dữ liệu mà nó không hoạt động (lưu-db x "url-db.txt") ... (def y (load-db "url-db.txt")) –

Các vấn đề liên quan