2017-11-20 3 views
-2

私はある種のコレクションにデータを保存しようとしていますが、私が持っているプログラムはすべてを別々のマップに保存しています。私は1つの地図にしたい。範囲外の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

'table'とは何ですか?また 'println'は' nil'を返し、 'assoc'はどこかに置いたかもしれない'(def table {}) 'を_not_ **変更**しません。 – cfrick

答えて

1

あなたがクロージャーに適応しているように見えます:-)私は同じプロセスに行きました。ハングアップ、それはそれの価値があるでしょう!

最初に、マップが関数の結果を新しいコレクションに保存することを理解することが重要です。 cfrickのように、printlnnilを返し、assocはマップを変更しません。

私は何をしようとするここでビットを推測している:あなたはすべての辞書はそうのような2つのキーを、持っているdictsのコレクションを、持っていると思います:

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

あなたは、これらの値は、来る必要ファイルから、しかし、あなたは唯一のラインが「201609」ではなく「TBA」

まず、いくつかの一般的な発言に含まれる行保存したい:

  • おそらく小さな部分にこの機能を分割したいが。 1つは行のチェック(contains 201609 but not tba)、もう1つはファイルを読むことができる...
  • 私はそれがあなたの質問のタイトルであることは知っていますが、おそらくグローバル変数を変更するよりも良い方法があります。多分あなたは関数を作ることができるreadFileテーブルを返しますか?
  • あなたの関数に引数を渡すことができれば試してみてください。
  • 私はあなたがラインで何をしようとしているのか分かりません(doseq [[...こちらにもっと文脈を与えてください。あなたはtableには、この関数の結果を追加したい場合は(read-file-and-parse "test.txt" "201609" "TBA")

    (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)))) 
    

    あなたは今、このように、この関数を呼び出すことができます。私はここで

が可能な解決策であることを無視しますconcatを使用できます。しかし、これもまたあなたのリストの新しいバージョン(新しいエントリが追加されたもの)を返し、前に定義したものを変更しません。

関数プログラミングへようこそ:)))