SQL and CSV
John Machin
sjmachin at lexicon.net
Thu May 7 22:42:04 EDT 2009
On May 8, 1:45 am, Nick <nic... at gmail.com> wrote:
> On May 5, 8:27 pm, Tim Golden <m... at timgolden.me.uk> wrote:
>
>
>
> > Nick wrote:
> > > Part of the problem is that the 'selection' needs to be in a config
> > > file. I can put the if row['status'] != 'Cancelled': return True into
> > > a config, read it and eval it, but its not quite as clean as ansql
> > > route.
>
> > Still not clear what the restriction is. If you were writingSQLyou'd have to read *something* from your config file,
> > unless you're suggesting that the "config file" is in fact
> > aSQLfile. Which is one way of doing it, but then you might
> > just as well have your config file as a Python file and
> > import it.
>
> > Have I missed the point somewhere here? Can you give an
> > example -- even a fictional one -- of what you couldn't
> > do using, say, the example I gave earlier?
>
> > TJG
>
> Solution found. In the end I used SQLite to read from a csv file, and
> now I can query the CSV file. The file is read using the csv module
>
> First create a function
>
> def fraction(p, denom):
> num, frac = p.split ('-')
> return float (num) + float (frac) / denom
>
> for use within queries.
>
> Now build the class.
>
> self.filename = filename
> self.dialect = dialect
> self.query = query
> reader = csv.reader (open (filename, 'r'))
> self.connection = sqlite.connect(":memory:")
> self.connection.create_function("fraction", 2, fraction) #
> Adds in function
> self.cursor = self.connection.cursor()
> first = True
> for row in reader:
> if first:
> headers = []
> for r in row:
> n = r.strip().replace (' ', '_').replace ('-','_')
> headers.append (n)
> command = 'create table csv (%s)' % ','.join (headers)
> self.cursor.execute (command)
> first = False
> else:
> command = 'insert into csv values ("%s")' % '","'.join
> (row)
> self.cursor.execute (command)
>
> and then I can use this
>
> self.cursor.execute (self.query)
> rows = self.cursor.fetchall()
> headers = []
> for r in self.cursor.description:
> headers.append (r[0])
> results = Results.Results (headers, self.name, {})
> i = 0
> for row in rows:
> results.add (row, i)
> i = i + 1
> return results
>
> to query the results.
>
> Results.Results is one of my classes that's reused in lots of places.
>
> The query then looks somethign like this
>
> select
> Client_Reference_Number as TrdNbr,
> Asset_Number as ISIN,
> Quantity as Qty,
> status
> from
> csv
The remaining lines of your SELECT statement are incredibly redundant
AFAICT. It seems you have pushed the contents of your csv file into a
data base and pulled them ALL out again ... not what I'd call a
"query". What's the point?
> where status in ("CANCELLED")
>
> union
>
> select
> Client_Reference_Number as TrdNbr,
> Asset_Number as ISIN,
> Quantity as Qty,
> status
> from
> csv
> where status not in ("CANCELLED")
>
> All incredibly neat and the first time I've used SQLite.
>
> nick
More information about the Python-list
mailing list