2009-08-18 8 views
6

프로그램을 다시 실행하면 데이터를 파일에 저장하고 데이터를 복원하려고합니다.defstruct를 파일로 유지하고 복원하는 방법은 무엇입니까?

나는 같은 내 defstruct을 정의했습니다 :

(defstruct 북마크 : URL : 제목 : 댓글) 단순히 다음을 수행합니다

프로그램 : 홈페이지-DB에서
1.로드 defstruct 년대를. txt
2. * command-line-args *에 전달 된 가져 오기 파일을 읽고 내부 데이터에 추가하십시오. var.
3. url-db.txt 파일을 다시 작성하십시오.

샘플 가져 오기 파일 :

www.cnn.com | 뉴스 |이 CNN
입니다 www.msnbc.com | 검색 |
news.ycombinator.com | 뉴스 | 테크 뉴스

+0

누군가가 내 앞에이 문제를 넘겼다 : http://stackoverflow.com/questions/923029/clojure-slurping-structs-from-file-fails-with-string-attributes-containing-white –

답변

8

톰 Crayford의 대답은 가까이, 대신 "홍보"기능을 사용하여 의 "인쇄". "pr"은 "read"로 다시 읽을 수있는 문자열을 생성합니다.

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

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

* print-dup *이 true로 설정된 경우에는 작동하지 않습니다. ticket #176을 참조하십시오. 데이터베이스를 다시 읽을 때 레코드는 구조체 맵이 아닌 일반 맵이 될 것입니다. 구조체 맵은 아직 pr/read로 직렬화 할 수 없습니다.

+0

, read-string과 pr-str 대신에 with-str과 with-out-str을 사용하는 이유가 있습니까? – alanlcode

+0

아닙니다. 내가 왜 그렇게 썼는지 기억하지 마라. –

+0

구조체 맵 대신 일반 맵으로 읽는 것이 언제 문제가됩니까? 나는 그들이 교환 할 수없는 곳을 만나지 않았다. 이 경우에는 (필요에 따라 일반화) 독서를 할 때 각 레코드를 빈 북마크로 병합 할 수 있습니다. –

2

사용 침과 후루룩 소리 내며 먹기 (http://www.nofluffjuststuff.com/blog/stuart_halloway/2008/09/pcl__clojure_chapter_3_1에서 가져온 예). 일반적으로이 기술을 직렬화라고합니다.

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

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

(초기의 인쇄 오류가 원래의 코드에 있었다, 나는 바보였다 그리고. 감사합니다 확인하지 않았다)

+0

(def x (struct 북마크 "news.ycombinator.com" "뉴스" "테크 뉴스")); "따옴표 안에있는 것"을 처리하지 않음 –

+0

그의 예제에는 따옴표로 묶인 이름이 있습니다. 데이터를 다시로드하려고 시도했을 때 작동하지 않았습니다 (save-db x "url-db.txt") ... (def y (load-db "url-db.txt")) –

관련 문제