Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Clojure读取包含测试数据的文件?_Clojure - Fatal编程技术网

如何使用Clojure读取包含测试数据的文件?

如何使用Clojure读取包含测试数据的文件?,clojure,Clojure,我正在写一段代码,需要在包含数据的文本文件中读取。文本文件的格式为: name 1 4 name 2 4 5 name 3 1 9 我正在尝试以[:name Sarah:weight 1 cost:4]的形式创建地图的向量 当我尝试使用line seq reader在中读取文件时,它会将每一行作为一项读取,因此分区不正确。见下文回复: (let [file-text (line-seq (reader "C://Drugs/myproject/src/myproject/data.txt"))

我正在写一段代码,需要在包含数据的文本文件中读取。文本文件的格式为:

name 1 4
name 2 4 5
name 3 1 9
我正在尝试以
[:name Sarah:weight 1 cost:4]
的形式创建地图的向量

当我尝试使用line seq reader在中读取文件时,它会将每一行作为一项读取,因此分区不正确。见下文回复:

(let [file-text (line-seq (reader "C://Drugs/myproject/src/myproject/data.txt"))
                       new-test-items (vec (map #(apply struct item %) (partition 3 file-text)))]
     (println file-text)   
     (println new-test-items))


(sarah 1 1 jason 4 5 nila 3 2  jonas 5 6 judy 8 15 denny 9 14 lis 2 2  )
[{:name sarah 1 1, :weight jason 4 5, :value nila 3 2 } {:name jonas 5 6, :weight judy 8 15, :value denny 9 14}]
然后我试着只取1个分区,但结构仍然不正确

=> (let [file-text (line-seq (reader "C://Drugs/myproject/src/myproject/data.txt"))
                                new-test-items (vec (map #(apply struct item %) (partition 1 file-text)))]
              (println file-text)   
              (println new-test-items))
(sarah 1 1 jason 4 5 nila 3 2  jonas 5 6 judy 8 15 denny 9 14 lis 2 2  )
[{:name sarah 1 1, :weight nil, :value nil} {:name jason 4 5, :weight nil, :value nil} {:name nila 3 2 , :weight nil, :value nil} {:name jonas 5 6, :weight nil, :value nil} {:name judy 8 15, :weight nil, :value nil} {:name denny 9 14, :weight nil, :value nil} {:name lis 2 2, :weight nil, :value nil} {:name  , :weight nil, :value nil}]
nil
接下来,我试图把文件弄脏,但更糟的是:

=> (let [slurp-input (slurp "C://Drugs/myproject/src/myproject/data.txt")
            part-items (partition 3 slurp-input)
            mapping (vec (map #(apply struct item %) part-items))]
            (println slurp-input)
            (println part-items)
            (println mapping))
sarah 1 1
jason 4 5
nila 3 2 
jonas 5 6
judy 8 15
denny 9 14
lis 2 2

((s a r) (a h  ) (1   1) (

请帮忙!这在Java中似乎很容易做到,但在Clojure中却要了我的命。

将其拆分为一系列行:

(line-seq (reader "/tmp/data"))
把它们分成一系列的单词

(map #(split % #" ") data)
创建一个函数,该函数获取一个数据的向量,并将其转换为具有正确键的地图

(fn [[name weight cost]] 
   (hash-map :name name 
             :weight (Integer/parseInt weight) 
             :cost (Integer/parseInt cost))) 
然后把它们重新套在一起

(map (fn [[name weight cost]] 
       (hash-map :name name 
                 :weight (Integer/parseInt weight) 
                 :cost (Integer/parseInt cost))) 
     (map #(split % #" ") (line-seq (reader "/tmp/data"))))

({:weight 1, :name "name", :cost 4} 
 {:weight 2, :name "name", :cost 4} 
 {:weight 3, :name "name", :cost 1})

您还可以通过使用
zip-map

使其更加紧凑。您正在尝试在一个地方完成所有操作,而无需测试中间结果。相反,Clojure建议将任务分解为多个子任务-这使得代码更加灵活,并且可测试。以下是您任务的代码(我假设文件中的记录描述了人员):


因为这是惰性的,所以当您不打算从文件中读取更多数据时,您需要记住关闭文件。(当空的lazy reader.split来自clojure.string,reader来自clojure.java.ioArthur时,我经常发现我的自包装序列处于关闭状态。非常感谢!我对此感到迷茫。我尝试了您的解决方案,但我得到了以下错误。=>(map(fn[[name weight cost]](哈希映射:name:weight)(Integer/parseInt-weight):cost(Integer/parseInt-cost))(map#(split%#“”)(line-seq(reader“C://druges/myproject/src/myproject/data.txt”))CompilerException java.lang.RuntimeException:无法解析符号:在此上下文中拆分,编译:(无源路径:5)请参阅上面的注释^。添加(:use)[clojure.string:only(split)]到您的名称空间定义太棒了!我这个周末刚刚学习clojure,所以现在一切看起来都很复杂。我非常感谢您的帮助。
(defn read-lines [filename]
  (with-open [rdr (clojure.java.io/reader filename)]
    (doall (line-seq rdr))))

(defn make-person [s]
  (reduce conj (map hash-map [:name :weight :value] (.split s " "))))

(map make-person (read-lines "/path/to/file"))