拆分字符串时clojure java.lang.NullPointerException

拆分字符串时clojure java.lang.NullPointerException,clojure,Clojure,我对clojure不熟悉。我试图编写一个程序,在读取数据后从文件(逗号分隔的文件)读取数据。我试图在分隔符“”的同时拆分每一行,但我面临以下错误: CompilerException java.lang.NullPointerException, 编译:(com\clojure\apps\StudentRanks.clj:26:5) 这是我的密码: (ns com.clojure.apps.StudentRanks) (require '[clojure.string :as str]) (

我对clojure不熟悉。我试图编写一个程序,在读取数据后从文件(逗号分隔的文件)读取数据。我试图在分隔符“”的同时拆分每一行,但我面临以下错误:

CompilerException java.lang.NullPointerException, 编译:(com\clojure\apps\StudentRanks.clj:26:5)

这是我的密码:

(ns com.clojure.apps.StudentRanks)
(require '[clojure.string :as str])

 (defn student []
  (def dataset (atom []))
  (def myList (atom ()))
  (def studObj (atom ()))
   (with-open [rdr (clojure.java.io/reader "e:\\example.txt")]
    (swap! dataset into (reduce conj [] (line-seq rdr)))
   )
  (println @dataset)
  (def studentCount (count @dataset))
  (def ind (atom 0))
  (loop [n studentCount]
  (when (>= n 0)
   (swap! myList conj (get @dataset n))
   (println (get @dataset n))
   (recur (dec n))))
  (println myList)
  (def scount (count @dataset))
  (loop [m scount]
 (when (>= m 0)
   (def data(get @dataset m))
   (println (str/split data #","))
   (recur (dec m))))
  )
(student)

提前感谢。

我建议您使用csv库:

(require '[clojure.data.csv :as csv])
(csv/read-csv (slurp "example.txt"))

除非这是一些文件io练习。

如注释中所指出,第一个问题是您没有编写正确的Clojure。 首先,
def
永远不应该嵌套——它不会像您希望的那样运行。使用
引入局部变量(通常称为局部变量,因为称变量为不变的东西很奇怪)。 其次,类似块的构造(如
do
let
with open
计算为其最后一个表达式的值

所以这个片段

(def数据集(atom[]))
(打开[rdr(clojure.java.io/reader“e:\\example.txt”)]
(将数据集交换为(reduce conj[](行顺序rdr)))
应该写

(让[数据集
(打开[rdr(clojure.java.io/reader“e:\\example.txt”)]
(转入[](行顺序rdr))]
;使用数据集的代码位于此处
)
然后,通过向后遍历数据集(一个向量)并考虑正在构建的列表,尝试将其转换为列表(
myList
)。这是不需要的。只需调用向量上的
seq
,就可以从向量中获得序列(类似于列表)。(或者如果希望反转列表,可以调用
rseq

最后,再次迭代以拆分和打印
数据集中保存的每个项目。使用索引进行显式迭代在Clojure中非常少见,更喜欢
reduce
doseq

这里有两种编写
学生
的方法:

(defn student[];仅用于打印
(打开[rdr(clojure.java.io/reader“e:\\example.txt”)]
(doseq[数据(行顺序rdr)]
(println(str/split data#“,”)))
(defn student[];返回值
(打开[rdr(clojure.java.io/reader“e:\\example.txt”)]
(转入[]
(对于[数据(行顺序rdr)]
(str/分割数据#“,”))))

<>我希望这能帮助你更好地获得Culjule.< /P>在函数中不要使用<代码> DEF>代码>,使用<代码>让。我的建议是慢一点。作为新的CuljueLe,你可能想考虑原子,交换,甚至循环作为更高级的主题。你不需要任何这些东西来读取文件中的行并拆分它们。你很少需要它们,即使是在相当复杂的程序中:-)我的要求是逐行读取文件内容,并将每一行放入一个列表中。例如:我的文件内容是“1,bharath,85,86,89,85”,要求是:[(1 bharath 85 86 89 85)]。非常感谢。现在我更明白了。