2016-12-08 3 views
0

clojure를 사용하면 어떻게 문자열 파일을 읽고 int 배열이나 벡터에 저장합니까?Clojure : 문자열 파일을 정수 배열에 넣기

여기 내 기능이 있습니다.

(:require [clojure.java.io :as io]) 
(defn getData [filename] 
    (doseq [line 
    (with-open [rdr (io/reader filename)] 
     (doall (line-seq rdr)))] 
     (println line))) 

(defn convert [string] 
    (map #(Integer/parseInt %) 
    (.split #" " string))) 

여기에서 어디로 가야할 지 모르겠습니다. convert 함수 내에서 getData 함수를 호출하려고했지만 getData 함수가 문자열을 반환하지 않기 때문에 운이 없었습니다.

-> (apply convert (getData "num.txt")) 

답변

0

당신은 Clojure에 대해 좀 더 읽어 아마 이해 조금 선명하게 4clojure에있는 것과 같은 몇 가지 운동을 통해 가야한다. 시도가 매우 혼란스럽고 모든 행이 무엇을하는지 이해하지 못합니다.

기본적으로 모든 줄을 doseq으로 채우고 화면에 인쇄하면 nil이 반환됩니다. 그런 다음 nil로 전환 신청을 시도합니다. doall의 결과 만 반환하면됩니다.

convert 함수의 경우 문자열 목록을 분할하려고하므로 먼저 목록에 split을 매핑하고 그 결과에 parseInt을 호출해야합니다. apply을 사용하여 호출해야 할 필요는 없으며 인수를 문자열 목록으로 처리하면 조금 더 의미가 있습니다.

0

먼저 파일이 어떻게됩니까? 당신이 원하는 그런

(defn parse-line [str-line] 
    (->> (str/split str-line #" ") 
     (map #(Integer/parseInt %)))) 

:

난 당신이 정수의 집합 (캐릭터/분할 clojure.string에서이다)로 줄을 구문 분석 할 것이 그

1 2 3 
4 5 6 
7 8 9 10 

처음처럼 가정 모든 행에 이것을 적용하려면 정수의 큰 배열 (Java 배열?)을 반환합니다.

(defn getData [filename] 
    (with-open [rdr (io/reader filename)] 
    (let [data (line-seq rdr)] 
     (int-array (mapcat parse-line data))))) 

원하는 경우 별도의 배열을 사용하는 경우

(defn getData [filename] 
    (with-open [rdr (io/reader filename)] 
    (let [data (line-seq rdr)] 
     (doall (map (comp int-array parse-line) data))))) 

Line-seq은 일련의 줄을 반환합니다. 따라서 한 라인을 광고하더라도 line-seq는 한 라인을 포함하는 시퀀스를 반환합니다. 벡터를 원하면 int-array를 vec로 바꿉니다. 시퀀스의 경우 int-array를 제거하십시오.