3

私はこのクエリを持っています:

(?<- (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 ファイルを 1 行ずつ読み取り、有効なデータ条件 ( ) を満たす行をチェックしますdata-line?- この部分は機能します。次に、行をカンマで分割し、ベクトルをfilter-out-data関数に渡します。関数は、そのベクトルから抽出された 2 つの項目を返します。クエリを実行すると、次のエラーが表示されます: Unable to resolve symbol: ?linein this context.

分割の結果を渡すさまざまな方法を試してきました(分割のサイズが異なるため、柔軟にしたいと思います)。私は Clojure と Cascalog から始めたばかりです。正しい方向に向けていただければ幸いです。ありがとう!

4

1 に答える 1

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 ライブラリを使用すると、コードをさらに簡素化できます。

于 2013-07-07T16:38:58.340 に答える