2017-10-03 4 views
-7

저는 Clojure에서 아직 새로운입니다. txt 파일에서 구문 분석 된 값을 분할하려고합니다.Clojure에서 기호로 나열하려면 txt 구문 분석하는 방법?

이 단어를 목록에 sembol로 추가해야합니다. 예를 들어

예 txt 파일은 :

이 간단한 테스트

이며, 결과는 다음과 같아야합니다 사전에

'((t h i s) (i s) (a) (s i m p l e) (t e s t) 

하시기 바랍니다 도움이, 감사합니다.

이 같은

뭔가 :

user> (require '[clojure.string :as cs]) 
nil 

user> (defn to-syms [s] 
     (let [words (cs/split (cs/trim s) #"\s+")] 
      (map #(map (comp symbol str) %) words))) 
#'user/to-syms 

user> (to-syms "this is a line") 
;;=> ((t h i s) (i s) (a) (l i n e)) 

UPDATE

확장

+7

질문을 무시하십시오. 이 사이트가 작동하는 방식이 아닙니다. –

+4

당신은 파이썬 코드가 아니라 Clojure 코드를 요구했습니다. 파이썬에 관해 묻기 위해 질문을 편집하면 답이 있다는 것이 도움이되지 않습니다. – DJMcMayhem

답변

1

을 먼저 사용하십시오. 문자열의 단어를 얻으려면 먼저 split을 호출해야합니다. 그런 다음 각 단어에 대해 문자를 반복하여 기호로 변환해야합니다. for 매크로를 사용하여 반복하는 것이 가장 쉽습니다. str을 사용하여 문자를 문자열로 변환하고 symbol을 사용하여 기호로 기호를 변환 할 수 있습니다.

(defn line-to-lists [line] 
    (for [word (clojure.string/split (clojure.string/trim line) #"\s+")] 
    (for [char word] (symbol (str char))))) 

(line-to-lists "this is a simple test") 

당신은 slurp를 사용하여 파일의 내용을 얻을 수 있으며, 다음과 같은 그것에 함수를 호출 :

(line-to-lists (slurp "file.txt")) 

편집 : 여러 공간과 traling/선행 공백 작업을 고정합니다. EDIT : 문자열/트림을 추가하여 불필요한 화이트 페이지를 제거하십시오.

+0

은 여러 공백으로 인해 실패합니다. (줄 바꿈 목록 "asd {three-spaces} asd") => ((asd)()()() (asd)) 및 후행 공백의 경우 예 : – leetwinski

+0

@leetwinski , 고정! – erdos

+1

은 공백을 유도하는 데 여전히 실패합니다. (행 - 목록 "asd") => (() (a s d)) .. 죄송합니다 :) – leetwinski

5

먼저 당신은 단어, 에 선 후 모든 단어 변환 기능을 char->symbol로 매핑해야을 분할해야 :

먼저 str의 모든 단어를 가져옵니다. 공백으로 나누기 :

(cs/split (cs/trim "aaa bbb ccc") #"\s+") 
;;=> ["aaa" "bbb" "ccc"] 

그런 다음 단어를 처리하여 기호 목록으로 변환하는 함수를 만들어야합니다.

(defn char->sym [c] 
    (symbol (string c)) 

user> (char->sym \a) 
;;=> a 

user> (map char->sym "asd") 
;;=> (a s d) 
;; in my example i use the functional composition: (comp symbol str) 
;; that creates the function that works exactly like char->sym 

;; let's wrap this mapping to a function: 
(defn word->syms [w] 
    (map char->sym w)) 

user> (word->syms "asd") 
;;=> (a s d) 

;; and now we just have to transform the whole list of words: 
user> (map word->syms ["asd" "fgh"]) 
;;=> ((a s d) (f g h)) 

이 외에도, 당신은 단순히 모든 목록의 항목과 함께 str 함수를 호출 할 수 있습니다 문자열을 백업하는 기호 목록을 변환 : Clojure의 문자열은 문자의 순서이기 때문에, 당신은 새 컬렉션을 그 위에 map, 생산 수 인수가 (apply str '(a s d)) => "asd"이거나