我有这个问题:
(?<- (hfs-textline data-out :sinkmode :replace)
[?item1 ?item2]
((hfs-textline data-in) ?line)
(data-line? ?line)
(filter-out-data (#(vector (s/split % #",")) ?line) :> ?item1 ?item2)
)
(defn data-line? [^String row]
(and (not= -1 (.indexOf row ","))
(not (.endsWith row ","))
(not (.startsWith row ","))))
(defn filter-out-data [data]
(<- [?item1 ?item2]
(data :#> 9 {4 ?item1
8 ?item2})))
查询逐行读取CSV文件,并检查符合有效数据条件的行(data-line?
) - 此部分有效。然后它应该用逗号分割该行,并将该向量传递给filter-out-data
函数,该函数又返回从该向量中提取的两个项目。当我执行查询时,我收到以下错误:
在此上下文中无法解析符号:?line
。
我一直在尝试传递分割结果的不同方法(我希望它灵活,因为分割的大小不同)。我刚刚开始使用Clojure和Cascalog,如果你能指出我正确的方向,我将不胜感激。谢谢!
答案 0 :(得分:4)
函数filter-out-data
会生成一个子查询,但您尝试将其用作谓词,但不会起作用。
我建议您将表达式(#(vector (s/split % #",")) ?line)
中的所有逻辑移动到您仍然可以调用fill-out-data
的常规函数。
(defn filter-out-data [data]
(let [[_ _ _ item1 _ _ _ item2] (s/split % #"," data))]
[item1 item2]))
(?<- (hfs-textline data-out :sinkmode :replace)
[?item1 ?item2]
((hfs-textline data-in) ?line)
(data-line? ?line)
(filter-out-data ?line :> ?item1 ?item2))
但是,您可以使用像data.csv这样的CSV库来简化代码。