2017-11-20 12 views
-2

데이터를 일종의 컬렉션에 저장하려고하지만 프로그램에서 모든 것을 별도의지도에 저장하고 있습니다. 나는 그것을 하나의지도로 만들고 싶다.범위 밖의 Clojure지도

(defn readFile [] 
    (map (fn [line] (clojure.string/split line #";")) 
     (with-open [rdr (reader "C:/Users/Rohil/Desktop/textfile.txt")] 
     (doseq [[idx line] (map-indexed vector(line-seq rdr))] 

      (if(.contains line "201609") 
      (if(not(.contains line "TBA")) 
       (println(assoc table :code(nth(clojure.string/split line #";")3) :instructor(nth(clojure.string/split line #";")19))) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 

도움이 되겠습니다.

+0

'테이블'이란 무엇입니까? 또한'println'은'nil'을 리턴하고'assoc'은 어딘가에 넣을지도 모르는'(def table {})'을 수정하지 않습니다. – cfrick

답변

1

당신이 클로저에 적응하는 것처럼 보입니다 :-) 나는 같은 과정을 겪었습니다. 잠깐만, 그만한 가치가있을거야!

첫 번째 :지도가 함수의 결과를 새 컬렉션에 저장한다는 사실을 깨닫는 것이 중요합니다. cfrick이 언급 한 것처럼 printlnnil을 반환하고 assoc은지도를 변경하지 않습니다.

[ 
    { :code 1 :instructor "blah"} 
    { :code 2 :instructor "boo" } 
] 

당신은 와서이 값이 필요합니다 : 모든 DICT 그래서 같은 두 개의 키를 가지고 dicts의 컬렉션을, 갖고 싶어 :

은 당신이 무엇을하려고 여기에 조금 같은데요

  • 당신은 아마 더 작은 부분으로이 기능을 분할 할 : 파일에서,하지만 당신은 단지 라인이 "201609"를 포함하지만 "TBA"

    먼저 몇 가지 일반적인 발언은 어디 라인을 저장할. 하나는 줄 수표 (contains 201609 but not tba), 다른 하나는 파일을 읽을 수 있습니다 ...

  • 저는 이것이 당신의 질문의 제목이라는 것을 알고 있습니다 만, 아마도 글로벌 변수를 변경하는 것보다 더 좋은 방법이있을 것입니다. 어쩌면 당신은 함수를 만들 수 readFile 반환 테이블?
  • 함수에 인수를 전달할 수 있는지 확인하십시오.
  • 줄을 사용하여 무엇을 하려는지 확실하지 않습니다. (doseq [[... 여기에 더 많은 내용을 보내주십시오. 지금과 같이이 함수를 호출 할 수

    (ns test 
        (:require [clojure.string :as s] 
          [clojure.java.io :as io])) 
    
    (defn line-filter [include exclude line] 
        (and (not (s/includes? line exclude)) 
         (s/includes? line include))) 
    
    (defn process-line [line] 
        (let [line-parts (s/split line #";") 
         code (nth line-parts 3) 
         instructor (nth line-parts 19)] 
        {:code code :instructor instructor})) 
    
    (defn read-file [file-name] 
        (s/split (slurp (io/resource file-name)) #"\n")) 
    
    (defn parse-lines [lines] 
        (map process-line lines)) 
    
    
    (defn read-file-and-parse 
        "This function will read a file, process the lines, and output a collection of maps" 
        [filename search-for exclude] 
        (parse-lines 
        (filter #(line-filter search-for exclude %) 
        (read-file filename)))) 
    

    : 나는 여기

이 가능한 솔루션을 무시합니다 (read-file-and-parse "test.txt" "201609" "TBA")

당신이 당신의 table에이 함수의 결과를 추가하려면 concat을 사용할 수 있습니다. 그러나 다시 말하지만, 이것은 (새로운 항목이 추가 된) 목록의 새 버전을 반환하고 이전에 정의한 항목을 변경하지 않습니다.

함수 프로그래밍에 오신 것을 환영합니다 .-)))