Making progress but still in the trenches… On Oct 5, 3:29 pm, Alan <a...@malloys.org> wrote: > No, that compiler message is the one that comes up when your Clojure > parens don't line up; problems in the regex wouldn't appear until > runtime. It looks like I put too many close-parens after .find. Try > changing the offending line to: > > (re-groups (doto (re-matcher pattern line) .find))
Making this change now runs further until informing me that… clojure.java.io$reader cannot be cast to java.io.BufferedReader [Thrown class java.lang.ClassCastException] > > Also it occurred to me that my (split) doesn't handle the commas you > have, so the regex should probably be something more like #"[ ,]+" okay, thanks :) > > On Oct 5, 2:49 pm, Avram <aav...@me.com> wrote: > > > > > Alan, thanks for your response, I'm still new at this. Running it, > > the part with refer had an issue, but I tinkered and got past that on > > line #3. > > I also added a print statement to see what the output looks like, but > > there appears to be a hidden unmatched delimiter somewhere (??). I'm > > digging around for it… i suppose it is in the regex? > > > (use 'clojure.java.io) > > (require 'clojure.string) > > ;;(refer 'clojure.string :only [split]) > > (refer 'clojure.string :only '(split) ) > > > (let [pattern #"case when (\\S+) in \\(([^)]+)\\) then (\\S+) as (\\S > > +)"] > > (with-open [sql-in (reader "/Users/avram/Downloads/pg.sql")] > > (doseq [line (line-seq reader)] > > (let [[_ in-str then-str as-str] > > (re-groups (doto (re-matcher pattern line) .find))) > > in-list (split #"\\s+" in-str)] > > ;;now do whatever you want with in-list, then-str, as-str > > (print in-str) > > )))) > > > java.lang.Exception: Unmatched delimiter: ) > > [Thrown class clojure.lang.LispReader$ReaderException] > > > Restarts: > > 0: [QUIT] Quit to the SLIME top level > > 1: [CAUSE1] Invoke debugger on cause Unmatched delimiter: ) [Thrown > > class java.lang.Exception] > > > Backtrace: > > 0: clojure.lang.LispReader.read(LispReader.java:180) > > 1: clojure.core$read.invoke(core.clj:2868) > > 2: clojure.core$read.invoke(core.clj:2866) > > > I'll study this and tinker on.. > > > Many thanks, > > ~Avram > > > On Oct 5, 2:10 pm, Alan <a...@malloys.org> wrote: > > > > (use 'clojure.java.io) > > > (require 'clojure.string) > > > (refer 'clojure.string :only [split]) > > > > (let [pattern #"case when (\\S+) in \\(([^)]+)\\) then (\\S+) as (\\S > > > +)"] > > > (with-open [sql-in (reader "/path/to/file")] > > > (doseq [line (line-seq reader)] > > > (let [[_ in-str then-str as-str] > > > (re-groups (doto (re-matcher pattern line) .find))) > > > in-list (split #"\\s+" in-str)] > > > ;;now do whatever you want with in-list, then-str, as-str > > > )))) > > > > Not tested at all, but this is how I'd approach it - read a bunch of > > > lines, split them into useable chunks with a regex, and then process > > > each line. The regex will probably need tuning for your data set if > > > not every line looks exactly like your example, but hopefully you get > > > the idea. > > > > On Oct 5, 11:45 am, Avram <aav...@me.com> wrote: > > > > > Hello Clojurians, > > > > > I'm a beginner with clojure, but feel I have a situation that macros > > > > might be well-suited. > > > > > The problem description is that I have a few sql files with a couple > > > > hundred lines of ANSI SQL. These files contain many SQL statements > > > > like the following: > > > > > case when a in ('Q1', 'Q3', 'Q8', 'Q9') then textvar end as qv100, > > > > > The task here, is that I need to convert these ANSI SQL files to > > > > something that can be run in Hive SQL. My current belief is that Hive > > > > SQL does not support "in" clauses (http://wiki.apache.org/hadoop/Hive/ > > > > LanguageManual/UDF), so I need to convert the above snippet to > > > > explicit assignments like this: > > > > > case when a='Q1' then textvar when a='Q3' then textvar when a='Q8' > > > > then textvar when a='Q9' then textvar end as qv100, > > > > > Thus, for each value in the "in" clause there will be a "when a=value" > > > > item. > > > > > So, I think I need a function or macro to read an sql file, identify > > > > all "case when" statements in the file where there is also an "in" > > > > clause, and translate the "in" clause to the explicit assignments, and > > > > output a corrected Hive-ready sql file. A complicating factor is that > > > > since there are single-quotes embedded in each line of the "in" clause > > > > statements, they likely need to be escaped a priori somehow. > > > > > Any thoughts, comments, solutions, or advice on how to tackle this > > > > with clojure much appreciated. > > > > Thanks in advance! > > > > > Regards, > > > > ~Avram -- 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