I do something very similar to this where I parse large CSVs and 
keep/discard rows of the CSV based on the values of columns.  Like you I 
had a hard time "getting" how to use reduce beyond trivial implementations.

I spent some time messing with reduce and learning how to construct more 
advanced reductions.  The result of that learning became this blog 
post: http://jarrodswart.com/clojure-like-im-five-reduce-functions/,  I 
hope it helps you too.



On Tuesday, March 4, 2014 5:14:49 PM UTC-5, Jason Felice wrote:
>
> Your welcome!
>
> I just realized that, in this case, filter and map are good enough, but 
> the general answer for threading state through the processing of a sequence 
> is to use `reduce`.  Coming from another language, it takes a while to 
> realize how often the answer is to use reduce.
>
> -Jason
>
>
> On Tue, Mar 4, 2014 at 4:07 PM, Dean Laskin <wdla...@gmail.com<javascript:>
> > wrote:
>
>> Awesome, thanks Jason! It looks much cleaner.
>>
>> Dean
>>
>>
>> On Tuesday, March 4, 2014 4:47:12 PM UTC-5, Jason Felice wrote:
>>
>>> Something like
>>>
>>> (with-open [rdr (clojure.java.io/reader "/dev/errors-sunday.csv")]
>>>   (->> (line-seq rdr)
>>>          (filter #(re-matches #"..."))
>>>          (map #(nth (string/split % #",") 1))))
>>>
>>> Will do what you want.  It's laziness to the rescue.
>>>
>>>
>>> On Tue, Mar 4, 2014 at 3:21 PM, Dean Laskin <wdla...@gmail.com> wrote:
>>>
>>>> I'm comparing two large files based on specific fields in the files. Is 
>>>> there a functional way of accumulating the results without atoms? (And 
>>>> since I'm a newbie, any other advice is appreciated!)
>>>>
>>>> (let [sun (atom []) fri (atom [])]
>>>>   (with-open [rdr (clojure.java.io/reader "/dev/errors-sunday.csv")]
>>>>     (doseq [line (line-seq rdr)]
>>>>       (when (re-matches #"^[^,]+,[^,]+,FAIL,.*$" line)
>>>>         (swap! sun conj (nth (string/split line #",") 1)))))
>>>>   (with-open [rdr (clojure.java.io/reader "/dev/errors-friday.csv")]
>>>>     (doseq [line (line-seq rdr)]
>>>>       (when (re-matches #"^[^,]+,[^,]+,FAIL,.*$" line)
>>>>         (swap! fri conj (nth (string/split line #",") 1)))))
>>>>   (println (nth (data/diff (set @fri) (set @sun)) 1))
>>>>   )
>>>>
>>>> Thanks,
>>>> Dean
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clo...@googlegroups.com
>>>>
>>>> Note that posts from new members are moderated - please be patient with 
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+u...@googlegroups.com
>>>>
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/clojure?hl=en
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Clojure" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to clojure+u...@googlegroups.com.
>>>>
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com<javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to clojure+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to